<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive BOM for KiCAD</title>
  <style type="text/css">
:root {
  --pcb-edge-color: black;
  --pad-color: #878787;
  --pad-hole-color: #CCCCCC;
  --pad-color-highlight: #D04040;
  --pad-color-highlight-both: #D0D040;
  --pad-color-highlight-marked: #44a344;
  --pin1-outline-color: #ffb629;
  --pin1-outline-color-highlight: #ffb629;
  --pin1-outline-color-highlight-both: #fcbb39;
  --pin1-outline-color-highlight-marked: #fdbe41;
  --silkscreen-edge-color: #aa4;
  --silkscreen-polygon-color: #4aa;
  --silkscreen-text-color: #4aa;
  --fabrication-edge-color: #907651;
  --fabrication-polygon-color: #907651;
  --fabrication-text-color: #a27c24;
  --track-color: #def5f1;
  --track-color-highlight: #D04040;
  --zone-color: #def5f1;
  --zone-color-highlight: #d0404080;
}

html,
body {
  margin: 0px;
  height: 100%;
  font-family: Verdana, sans-serif;
}

.dark.topmostdiv {
  --pcb-edge-color: #eee;
  --pad-color: #808080;
  --pin1-outline-color: #ffa800;
  --pin1-outline-color-highlight: #ccff00;
  --track-color: #42524f;
  --zone-color: #42524f;
  background-color: #252c30;
  color: #eee;
}

button {
  background-color: #eee;
  border: 1px solid #888;
  color: black;
  height: 44px;
  width: 44px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 14px;
  font-weight: bolder;
}

.dark button {
  /* This will be inverted */
  background-color: #c3b7b5;
}

button.depressed {
  background-color: #0a0;
  color: white;
}

.dark button.depressed {
  /* This will be inverted */
  background-color: #b3b;
}

button:focus {
  outline: 0;
}

button#tb-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#lr-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#bom-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-grouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-ungrouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-netlist-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}

button#copy {
  background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
  background-position: 6px 6px;
  background-repeat: no-repeat;
  background-size: 26px 26px;
  border-radius: 6px;
  height: 40px;
  width: 40px;
  margin: 10px 5px;
}

button#copy:active {
  box-shadow: inset 0px 0px 5px #6c6c6c;
}

textarea.clipboard-temp {
  position: fixed;
  top: 0;
  left: 0;
  width: 2em;
  height: 2em;
  padding: 0;
  border: None;
  outline: None;
  box-shadow: None;
  background: transparent;
}

.left-most-button {
  border-right: 0;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

.middle-button {
  border-right: 0;
}

.right-most-button {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}

.button-container {
  font-size: 0;
  margin: 0.4rem 0.4rem 0.4rem 0;
}

.dark .button-container {
  filter: invert(1);
}

.button-container button {
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

@media print {
  .hideonprint {
    display: none;
  }
}

canvas {
  cursor: crosshair;
}

canvas:active {
  cursor: grabbing;
}

.fileinfo {
  width: 100%;
  max-width: 1000px;
  border: none;
  padding: 3px;
}

.fileinfo .title {
  font-size: 20pt;
  font-weight: bold;
}

.fileinfo td {
  overflow: hidden;
  white-space: nowrap;
  max-width: 1px;
  width: 50%;
  text-overflow: ellipsis;
}

.bom {
  border-collapse: collapse;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 10pt;
  table-layout: fixed;
  width: 100%;
  margin-top: 1px;
  position: relative;
}

.bom th,
.bom td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

.dark .bom th,
.dark .bom td {
  border: 1px solid #777;
}

.bom th {
  background-color: #CCCCCC;
  background-clip: padding-box;
}

.dark .bom th {
  background-color: #3b4749;
}

.bom tr.highlighted:nth-child(n) {
  background-color: #cfc;
}

.dark .bom tr.highlighted:nth-child(n) {
  background-color: #226022;
}

.bom tr:nth-child(even) {
  background-color: #f2f2f2;
}

.dark .bom tr:nth-child(even) {
  background-color: #313b40;
}

.bom tr.checked {
  color: #1cb53d;
}

.dark .bom tr.checked {
  color: #2cce54;
}

.bom tr {
  transition: background-color 0.2s;
}

.bom .numCol {
  width: 30px;
}

.bom .value {
  width: 15%;
}

.bom .quantity {
  width: 65px;
}

.bom th .sortmark {
  position: absolute;
  right: 1px;
  top: 1px;
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #221 transparent;
  transform-origin: 50% 85%;
  transition: opacity 0.2s, transform 0.4s;
}

.dark .bom th .sortmark {
  filter: invert(1);
}

.bom th .sortmark.none {
  opacity: 0;
}

.bom th .sortmark.desc {
  transform: rotate(180deg);
}

.bom th:hover .sortmark.none {
  opacity: 0.5;
}

.bom .bom-checkbox {
  width: 30px;
  position: relative;
  user-select: none;
  -moz-user-select: none;
}

.bom .bom-checkbox:before {
  content: "";
  position: absolute;
  border-width: 15px;
  border-style: solid;
  border-color: #51829f transparent transparent transparent;
  visibility: hidden;
  top: -15px;
}

.bom .bom-checkbox:after {
  content: "Double click to set/unset all";
  position: absolute;
  color: white;
  top: -35px;
  left: -26px;
  background: #51829f;
  padding: 5px 15px;
  border-radius: 8px;
  white-space: nowrap;
  visibility: hidden;
}

.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
  visibility: visible;
  transition: visibility 0.2s linear 1s;
}

.split {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: inherit;
}

.split.split-horizontal,
.gutter.gutter-horizontal {
  height: 100%;
  float: left;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
  transition: background-color 0.3s;
}

.dark .gutter {
  background-color: #777;
}

.gutter.gutter-horizontal {
  background-image: url('');
  cursor: ew-resize;
  width: 5px;
}

.gutter.gutter-vertical {
  background-image: url('');
  cursor: ns-resize;
  height: 5px;
}

.searchbox {
  float: left;
  height: 40px;
  margin: 10px 5px;
  padding: 12px 32px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 18px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 6px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  background-image: url('');
  background-position: 10px 10px;
  background-repeat: no-repeat;
}

.dark .searchbox {
  background-color: #111;
  color: #eee;
}

.searchbox::placeholder {
  color: #ccc;
}

.dark .searchbox::placeholder {
  color: #666;
}

.filter {
  width: calc(60% - 64px);
}

.reflookup {
  width: calc(40% - 10px);
}

input[type=text]:focus {
  background-color: white;
  border: 1px solid #333;
}

.dark input[type=text]:focus {
  background-color: #333;
  border: 1px solid #ccc;
}

mark.highlight {
  background-color: #5050ff;
  color: #fff;
  padding: 2px;
  border-radius: 6px;
}

.dark mark.highlight {
  background-color: #76a6da;
  color: #111;
}

.menubtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
  background-position: center;
  background-repeat: no-repeat;
}

.statsbtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.iobtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.visbtn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
  padding: 15px;
}

#vismenu-content {
  left: 0px;
  font-family: Verdana, sans-serif;
}

.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
  filter: invert(1);
}

.flexbox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.savebtn {
  background-color: #d6d6d6;
  width: auto;
  height: 30px;
  flex-grow: 1;
  margin: 5px;
  border-radius: 4px;
}

.savebtn:active {
  background-color: #0a0;
  color: white;
}

.dark .savebtn:active {
  /* This will be inverted */
  background-color: #b3b;
}

.stats {
  border-collapse: collapse;
  font-size: 12pt;
  table-layout: fixed;
  width: 100%;
  min-width: 450px;
}

.dark .stats td {
  border: 1px solid #bbb;
}

.stats td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

#checkbox-stats div {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

#checkbox-stats .bar {
  background-color: rgba(28, 251, 0, 0.6);
}

.menu {
  position: relative;
  display: inline-block;
  margin: 0.4rem 0.4rem 0.4rem 0;
}

.menu-content {
  font-size: 12pt !important;
  text-align: left !important;
  font-weight: normal !important;
  display: none;
  position: absolute;
  background-color: white;
  right: 0;
  min-width: 300px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 100;
  padding: 8px;
}

.dark .menu-content {
  background-color: #111;
}

.menu:hover .menu-content {
  display: block;
}

.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
  background-color: #eee;
}

.menu-label {
  display: inline-block;
  padding: 8px;
  border: 1px solid #ccc;
  border-top: 0;
  width: calc(100% - 18px);
}

.menu-label-top {
  border-top: 1px solid #ccc;
}

.menu-textbox {
  float: left;
  height: 24px;
  margin: 10px 5px;
  padding: 5px 5px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 14px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 4px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  width: calc(100% - 10px);
}

.menu-textbox.invalid,
.dark .menu-textbox.invalid {
  color: red;
}

.dark .menu-textbox {
  background-color: #222;
  color: #eee;
}

.radio-container {
  margin: 4px;
}

.topmostdiv {
  display: flex;
  flex-direction: column;
  width: 100%;
  background-color: white;
  transition: background-color 0.3s;
}

#top {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  align-items: center;
}

#topdivider {
  border-bottom: 2px solid black;
  display: flex;
  justify-content: center;
  align-items: center;
}

.dark #topdivider {
  border-bottom: 2px solid #ccc;
}

#topdivider>div {
  position: relative;
}

#toptoggle {
  cursor: pointer;
  user-select: none;
  position: absolute;
  padding: 0.1rem 0.3rem;
  top: -0.4rem;
  left: -1rem;
  font-size: 1.4rem;
  line-height: 60%;
  border: 1px solid black;
  border-radius: 1rem;
  background-color: #fff;
  z-index: 100;
}

.flipped {
  transform: rotate(0.5turn);
}

.dark #toptoggle {
  border: 1px solid #fff;
  background-color: #222;
}

#fileinfodiv {
  flex: 20rem 1 0;
  overflow: auto;
}

#bomcontrols {
  display: flex;
  flex-direction: row-reverse;
}

#bomcontrols>* {
  flex-shrink: 0;
}

#dbg {
  display: block;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: #aaa;
}

::-webkit-scrollbar-thumb {
  background: #666;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  margin: 3px 0;
  padding: 0;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  border-radius: 3px;
}

.slider:hover {
  opacity: 1;
}

.slider:focus {
  outline: none;
}

.slider::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  width: 100%;
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
  border: none;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin-top: -4px;
}

.dark .slider::-webkit-slider-thumb {
  background: #3d3;
}

.slider::-moz-range-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
}

.slider::-moz-range-track {
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
}

.dark .slider::-moz-range-thumb {
  background: #3d3;
}

.slider::-ms-track {
  width: 100%;
  height: 8px;
  border-width: 3px 0;
  background: transparent;
  border-color: transparent;
  color: transparent;
  transition: opacity .2s;
}

.slider::-ms-fill-lower {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-fill-upper {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin: 0;
}

.shameless-plug {
  font-size: 0.8em;
  text-align: center;
  display: block;
}

a {
  color: #0278a4;
}

.dark a {
  color: #00b9fd;
}

#frontcanvas,
#backcanvas {
  touch-action: none;
}

.placeholder {
  border: 1px dashed #9f9fda !important;
  background-color: #edf2f7 !important;
}

.dragging {
  z-index: 999;
}

.dark .dragging>table>tbody>tr {
  background-color: #252c30;
}

.dark .placeholder {
  filter: invert(1);
}

.column-spacer {
  top: 0;
  left: 0;
  width: calc(100% - 4px);
  position: absolute;
  cursor: pointer;
  user-select: none;
  height: 100%;
}

.column-width-handle {
  top: 0;
  right: 0;
  width: 4px;
  position: absolute;
  cursor: col-resize;
  user-select: none;
  height: 100%;
}

.column-width-handle:hover {
  background-color: #4f99bd;
}

.help-link {
  border: 1px solid #0278a4;
  padding-inline: 0.3rem;
  border-radius: 3px;
  cursor: pointer;
}

.dark .help-link {
  border: 1px solid #00b9fd;
}

.bom-color {
  width: 20%;
}

.color-column input {
  width: 1.6rem;
  height: 1rem;
  border: 1px solid black;
  cursor: pointer;
  padding: 0;
}

/* removes default styling from input color element */
::-webkit-color-swatch {
  border: none;
}

::-webkit-color-swatch-wrapper {
  padding: 0;
}

::-moz-color-swatch,
::-moz-focus-inner {
  border: none;
}

::-moz-focus-inner {
  padding: 0;
}
/* #bomhead {
    position: sticky;
    top: 0px;
    z-index: 1;
} */
  </style>
  <script type="text/javascript" >
///////////////////////////////////////////////
/*
  Split.js - v1.3.5
  MIT License
  https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});

///////////////////////////////////////////////

///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////

///////////////////////////////////////////////
/*!
 * PEP v0.4.3 | https://github.com/jquery/PEP
 * Copyright jQuery Foundation and other contributors | http://jquery.org/license
 */
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});

///////////////////////////////////////////////

///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////

///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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dmyWbW54ZnVSZ2iyxoXDwBZ1kAFm2t5sDmNeaBJynmzYAlJsTnneei5/tmhWbz5zYmoeanLZaLejhL52uneaft6f3mkefT5pWnL8K59J3mc+Y1Z5vmVSdb5hCIaZqSWTvmoce752HGU+b75oPnq+ZXgWvm1OYu56Dmx+aXphtx1tmcPNnHaifrMLvm0ucxgXvnyeaX5jPmcueFuXXn1+bsZzfmRmb8yZ/wDGdL51yRy+eY5yvnjuc6Zy/nqecx5/XmI+Yh57jnPKfv5mWBH+drp8qmJuYX50/nNeYH5mvnlmbr5kfmcOa459bnUCcAFh+B4+Zt6J/nQBb958AW2mbP5qAWV+ZgFtfn6+YN5v/nEBYAFrCBc6mAF6hm5+eP5rAXraar58/nB+dX578Bv+Y35hAX8+Yn529QeeaQ5iJQjKaT5nvmaBZE51jmCBbgFl3nI+YG51UnFsmmip2562aH6svm8yZP57AXIBZO5xZnP+eH5qDmb+dYFlvmueeWodaKpBYB5yZmn+aoF7YB5BdoF9/nUeZUFsPm6ebUp13nIefi546JJBadx/fmZBbH2MAWK+bt54PmGBfwFpgW9eZYF6wX/+dsFivLcmhhpxwX0BcMFzgBjBdOJnAWlBYv5ofmLBZ/5qwXRBek51UneOY9MCgXX6dCFnABwhcD5xQWP+ZiF7Pm1BdhZ2/mkhYCFgNFUhYP5l/mpubcF5fncEEYF/SBmBfUF3wWSBf8FwXoH+ekFkIWj+aMF/gWshboF3AXqhc8F2oXvBfqFhIW8efypuwXLot2JxwXS4FkFlwXX+cqF+gXoBav5wgX6eeu5vdmdOdSpnZnSuYM5yUBWeeSZszmWxmL6S9qyib55okm1ZkUJmpiuBalpmzJMmiTpvrmU6Y+Zu/mAhZvHSVogibJgMRm5Wdt5/vmohap51QXKOex5xvn3WaGFmwW6aYeFwehHqf3IGdmm2ZMFlHnteYi5vIWfhd/5zznPKbSEVFm5IAKZgkAwCfaFgunU+cy57oXPhcjwPoXFuYGFgoWNBfH5n8mESmjiiDr2udv6L/gzWYUFnEXwufxFjHnCRdz54kWl6YMMaCB+EqQ5+BmYIEbZoLmsRbf5qEXFma3SIZlvhYK5+EXrqZGZsKhkRb35iknCme4ALqwaRchF+3nBRYZFmnnr+aJFhoW2BdJFyUXE4tg6ykW4gHlFt4W+RdmFnoWzudiFnwWARb8FoEXBeh2soIWKSbBFzNnXOZmFj4XwuYWF4QXJOYtFxoWrRfZFv+RQRbR514Ws2cO550XUeZhF2AX8hdz5hnnbua9pjYWHuclAQ3HKuc554On+hj8h+9nbOdLgQ7GMBeXxqqnPqACpsHmPRc0ZytmSGaTFmCBm8q4F56nDRaR58jm82etZhdmAmbXZr4mAaZCZgVm/hdi5zSnh2a2J69jkxfk5ssWAxfV54KmBqbLp8KmO2dHpsbnAafD5+IXiBfzFtsX/2dDGekhSxa6pnsW+Rb7F9HmBxe8Z21n5GfrFxTm4RfHF4WnRWfeADsWYIFnFoDn5xcdFqbmlxfMZ8Fnm2bQZkcXGxfWZ5YXtOd0AXTn1hfu549nzAH1xiHAjmZSZ2rmixbSbT4ZmaeyZ0qnNMnDJ9rmHbidZ64Wv2feZz1ndxd09SJBJrDnFuGmFRYEFkKmqxeXZmsXV2cXJhsXFhamp5sXcedbF7inUme/Fyqo4JaHJhCWZ8fep0um22cHFldnC2aepjCW3RcK5u8XiuajF58WWed9p/XGMSZe5mrm+8m/apiYwBqOFn7mh+vTF6UXIybR57MWZad658CX+uaTZqCW19mA5mDqKRb0FqTh4JbElmYXKxYjZixnlWc7ZtanaJbDFjVnVuZZF6SWBeXA6hwW/KaUlhHmK+bPFpdnKJdQl6iXEKdHFywX2KbzFqlnuie/au8YiJcIp2dmtqbAplGnzxY5ZocWrxZxp06mtxYclicWnJfTp5Txfmbbso8XTJY8lsnmgqbIly1mlWb8lu1mhKe0loKWd8YjF1YXomafF5nnszlfFpbGTOZppziW9xZmgWDJQIBTFkMnPfAdxvGguBddxuqnxuZil8SXJeYglqSWCxfM5kDGFLJQF9FmY8b7xvmnXBdUl8iXEpZnxvPGC8eoltiBopbSl1rCNRdCl4OnNyMWSgxnupdQ5hGm+pdU5hKXI2fPJ4aX58c0llfHxpdFF7cWW6anFsKWSpZsyMqWJmZwJwLBLacDFyIXUzo8mfsWKJdXF2sWgiaGZC2nMJcbppvn9JdalqyB3zVKlzqXaibOlm/HlJam5z+m1JYvFjSXhxbtFwcnnpbolpYXkiciZzKWD2fSpliXDOZ2F17nPpepydViNGHKl/iWSSfs5xfZURapJtpQcxZuFjznxRa8544K2xvjcMrYUufh5k8XLpeyF4MXXRZ0lpsXtaf+FkKWSRexJ8Y1yZaOOYnnnmZAQJ0Wrpfplr/mmRdH5jKWHxbWFw9noxZfFyUBUSffFgqXjmfM5hijCZouUaDo/xYOx37nSSdxlykXVMmB58XnGpZex5qXhhflllcZUZvtEUgVUBZ5J1LnyhdplukXgxZqFgkW1RbJZvSWppbZl/KmFZZpmn615pYC5y2X3hf5l6EXbZcZF+2XhZYYlxnmmJZyltEmOeY4l9OnNyI7iTGX/xbs5vJmz401lopm8CcPIz9mmpcklg2W+8ijljvJpBayuamXk+dcFoMXfZZVFuoWt2Zx58tnARZIZqOW0kA9li2W5Bc6FtPmfZcFFv2XVRZel9KWg5cjFvTnQ5eyJ+bGZZee5wqX06ZZxhk5eeayZ1WW45f+51AWgeYJlvMmeudTlvWX05YrlxanB5dm0ISWPGbzlvgWC5cblnLmQxaEFxmW+2eZllsXLRZIZpeWsiCQ5htmeZY6FjeW6ZehFhmWJpZhJzgmbubhlpnmyudfF8OX+5arZnLa11mtxkqmBJaAlvQWqqavAdIXsIFzF1mXk2ffl4HGytqil4iXyxYBJ/qXVpfUlpKX1xZSlzcXdpdellmWdxY+l4OBySHSmCBWuxePFiEW3qe8lyyX7pbQl68XW5cmlxyWdWZTZnLaxWEgV9yX8FdIlwhXkJaslw6mGGeSlrSXkFbHF4KX0FYOlqtmsFfYaGhXcFeil+hWdqcYV4GXfJaolraXbJZvF90WQFeklslQDYAepwRWoFYXFwemLJaYV4hWbJefJuyW4ha4V/aW8Jdbxn5lsFcUVhSXuxZpl3sX4pdbZwaXrJckVrRXpFaIF7hX9FbFZ4HH5K1oV4ynhFYkp0RWBpbWlhBWiWfYV3GmoZb2lkVmMFfppJnlCedcV+GnTKdPFixXKKasVlhW1xd8VmiWOFfsltuWYZYfl0WWspfFl5iXcpclAE9nkZaKljWUYJZqNAOYR5d0AVmmhmTtxofJhedMQd9msWeAVhEWU2a6IcyBKZafJxjmVFZgVlaX+hYDlpmWB2adl1kXQiDGGIpXUBYU5/xWzFaNF2BXOlbIVwoXdWcaVr4BPHAY5xTn3FYiJwQWvBa6VkQWQFZHZ585phlB2ATmRlcWV47mzRcGF9ZWvmc2V4sW3Yq7F1pXRlYrFjpW7ZcmVlkWNleB2fMdmlfwpi5W9lfGVm5WAlddp1JWVhfSV+GWj2cRlnJX4xYjl4OnkhYWcGOWDscfZipWl8lOlo6WalaE53WWKmel5kmX/2Zru/RnzlYWVmZmVJeuV/2WyFcdlihWl6e5sZBA0WZaV9FW0OeWl5ZWJlY+VnfG7la2JpM6nCn454lXdlYxVioW3lexVylXyFaOV5FXPeZXloSmXlaZVw7mWVZbltlWplfTp5IXHFHmVxlXSVcxV8lX3ld3lmRX6leDp2lWBFmcFoZXZJdOpo4myVaQl0MXb5ZFlx8XMla7l1iWrgBEJoFXUmd7I05XANW+52OW0xd/lieXDsATp6DowJbTl24XIJeCV2GBHIdNpwynlFcuV9pXpVcGp7xWJFbBl/6mklZ0VhNmtWZalnhWTVaH630dwlZIlkRXyKeXFu6XzWf8lwNWRle1V9uXH5ZDl5+WpZfylvuW5ZczlofrJnF4lkpXiSdv6eOWd+uXxyeWXOf0yCXm55adVxIXuic3I2bRjJe7x3OWSeeoFy+XrZaLlm+WUFZDV4VWZpfzVsMRT5Z1JteX5+fbV0wXO1cFl1ZWrua+V+8XdVYRl7JXmAENx1+Xc1cqaFyHOxeKV7+WrVef541myYFElrNm6lb0VrfmgobNVis5Yac9V15WsVZXFxNW2FcSVlNXu1Zg596Xw1fM5sfq11ZVVvBXeRdUV6JXfVfgV/1Wk1Y3F29XOFapV3pXpJeChZa0nODLVj1W6FffVryW41Z8l/Nmf1evVqRXblaA1l1XlEWSQL3Zo1egVuKXPFbgVkGWfFe5ZvxXApbvVu+W7Se+V2dW/lfnVkAB5sZVAI1W35dSZrhhaLKLGMFXSlbVlnGWE5b0FitXk5fgG+FWpebxV+4W+uXH6jMWJhc9luuXR1YFFreWu1YA1+9Xelb418SzZZm5ljEWMhfrl7EWx1cFFiTXklfYJtNWflaflzYXmAByJpdXPxa4lofIebmckQtXv5euGQCXqifLV+onHWY5ppTnuNf1lheXvxlLgEnJ6Vfwpw3phiaY5ioXC5cz54uWhZe6Vt6XpNZpVlrmZblc1gcn3Nb4QEjmrZZU1kPnfNcnV+xWkVb4ZozWAdihVkxXwtd+JyVWvNc3lpOo1NeDVjTXp1cYlzuX+saEAOXG5MkBQYQAxCYMAAgADAExgEABUSaGAc7G2AAAABRQASoBvsdQAM4ApSYWAH5ACAEmAXrDmAChAWYAUADwAAFB2AHMAIvHAUBdAAKkaABOxq4ATsa4ACQAKAEwAU+AltdfMC9mhtbEJ1AB+wCMQWrXz2cozJMnUSfyl/gNatf9mF+A2vVq18HpOTTO1irnjgH95QYVatZllsfU7tcWx44BFYEo1h7XTtZzgSjXwei0gJ7Xz2d1FJ7XjOebpJ7XqNblKM7kQAGEJtIAwdaSZ44B4IDu17YWbtcYgOHW/tbcjT7XcleOAdpMQADPZm7WlIEx14zmQmTu1gOnjgHFpf2m/tc8AO7W8ieOAbWlcifPZ6Rk7tbYlm7WXaQNx7Km2QEKAA3HwwEp117W4xZu1y7XPtf1x3bXdYANx4zmUdaiANnWbtbB1/XHDtbJ1s7W3xZu1gOVpdcNVtIAA5TBxqYACAGMAUwBgwD6AdoAgye/Z0AAZAHpxlUAAAGkAAB0FMjhQYQBmdco1+AB92mJAeAAxaeBQOXHOsLEyPoBVif21gAB5AAA5d3X4AADuAABBAAAVP3WoQB914FAfdZPZk9n4AAAADT91q1BGtYAAdQ0yYFBbdbQAOVB4AEa18mQ8ADwAeAA/aZQATrDzsfsAU4AR8L6APrGA8dD1xrWAAEkTsd0IP2mK9a4AebH5aA0yP3WnubL193WEmfgAUvWK9cmwGQBq9aUJuvXgUAb1vrG+gGDwAPGT2bL1rQgnuZPZ13W/daUJ4PA+gA/KAPH3wBN1xShEADoAdsnUSat1kFJbdY4gh3WXkGZJiHAA8dRJ+wAiACt1rgBk9ZoAeABXdYgACAB4AAAAUR+QJYAoQEa14gA/abAAOTJvsfgAE/Xj0FT14hIM9fgAAAA1b7HKtdmAfMi+gENV/fXD9eP15PWuAHP1y/Wb9bv15pBH9aIAZ/XX9YGAd/XIDa/1ntgf9f/184AusML1zQASCADxlUBF9ZkAZfXV9dt1pHJ4AEbIIvht9ad1zQBBWgDx4FA/aahAYFBBccq13wBs9f8ACg2SIB/14FAbdca1uTI/9YIAcrW+gEiWgPGEUGv11vWT2eBQBJmoQDEN1vXrdc31tsJqDeZJ6jX6DcYNzQBmDdRx1g2oAHYNsABODa4Abg3eDf4N3/XBDeUNl3WDcbPZ2Sh9cdRJnIn3dahAE9nY9fgAfXGLDYtoKw2bDeUN4vWNia6QA3WoQHmx9fW4UAUNzywlDed1ofWNidIgIg2SDahANfXy4Pf1pvp7dYMAR3XlDbn1zw3oUG8NzQBfDfkNu3Wgjc0AB0B6cb91hFBf9fl4aFAMAE0AX/WcidWAd3WtMlm1igBr9ca1ig20AGJAH/XGtZ1QH/WajYiUNAAIlAz15Q3QDY2JgO4/dZPZgwViQGkNzQA/ddd1pQnHgDtx5Q38DY2Jg/WiACP1uVA0DYv1q/Xb9fv1zQAEDaQNiAA39Y/1qA3Gte/1zPWsDcAN4A3sjboN6Y3wDcegSA2H9af1l/WNjZQNigA0DZ2NjA29jYANnA3lDZENk43ZjYgNlPXFjdgNlY3mADWNq43NjbuN3Y2/9aeNoA3cDeYAeVB6cZmNo/Xr9ZPZ1Emg9ZD1sPXI9ej1mQA49Y0yVYAk9ZT1tPWUSB/17PXc9fz1w43wTbMNiHxUjYWxvw2bdcyN+I2d9aL1jw2kyddgIgBSDYyNrfXKTZoN8E2QjaTJhfXTdeINlfXIjbJNgI24jYSNovWkjaTJw3XF9eJAc3WfDd5Nik2BTc0AckBITdONj/Wz9a+N5Y34DcuN5A3UDc/1+43dQEwNkE2CTZAAHFB6cacN6XzJAFcN2w3NAHsNxw3nDfzoE03mSdLQA03LTeNN6w3TTeYAc03DTcsNx02bTeONpMnGtdd12PXr9d8N+w2y9b911Em/adT15vWLjcQN/42bjcBNh43gTewN0E2bTdeN9k3mgHCN7k3NACiNjfWpTapNzQBoUDlN9435jc+NmA3lTfDN9Y2ATcxNoE39jeeNwfWzDfIgY3XTdbFNi3X0jYzNpk3pTeYADUB6cZH1sfW7Dcn16fX/sZGxgbC6EB219HWqdYO19HXGdfRJ44APtZF1qmnjgB51qc3Aday6O7XpZfR1lcAntfyl17We5fR1yc2kyao19HXWvU+1uvWbta3NyjXAdZXNs7WqNb110HW7tYh17gAodfB6WHWztfh127HEdYfN5HWwdbR1tIAYYEx1v7WcdZPZvHXZzaTJwnW8gFZ1g5mbtal1z7WKdd+yVnW9Ncp1083edf9mEs0mdeOAT83F1Y511nWuddux/82Dcf51tC2hdfF18Ho9zZF1iXX0dbAtwi2ZZcdZOnWFde4AJXWg8aGxkbHWgHz1+AAIADK1tbGRsYIAVABM9bv1n7GesOWABrzbIFkAWDAgAAA=="))
///////////////////////////////////////////////

///////////////////////////////////////////////
/* Utility functions */

var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
  pcbdata.metadata.revision + '__#';
var storage;

function initStorage(key) {
  try {
    window.localStorage.getItem("blank");
    storage = window.localStorage;
  } catch (e) {
    // localStorage not available
  }
  if (!storage) {
    try {
      window.sessionStorage.getItem("blank");
      storage = window.sessionStorage;
    } catch (e) {
      // sessionStorage also not available
    }
  }
}

function readStorage(key) {
  if (storage) {
    return storage.getItem(storagePrefix + key);
  } else {
    return null;
  }
}

function writeStorage(key, value) {
  if (storage) {
    storage.setItem(storagePrefix + key, value);
  }
}

function fancyDblClickHandler(el, onsingle, ondouble) {
  return function () {
    if (el.getAttribute("data-dblclick") == null) {
      el.setAttribute("data-dblclick", 1);
      setTimeout(function () {
        if (el.getAttribute("data-dblclick") == 1) {
          onsingle();
        }
        el.removeAttribute("data-dblclick");
      }, 200);
    } else {
      el.removeAttribute("data-dblclick");
      ondouble();
    }
  }
}

function smoothScrollToRow(rowid) {
  document.getElementById(rowid).scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "nearest"
  });
}

function focusInputField(input) {
  input.scrollIntoView(false);
  input.focus();
  input.select();
}

function saveBomTable(output) {
  var text = '';
  for (var node of bomhead.childNodes[0].childNodes) {
    if (node.firstChild) {
      text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
    }
    if (node != bomhead.childNodes[0].lastChild) {
      text += (output == 'csv' ? ',' : '\t');
    }
  }
  text += '\n';
  for (var row of bombody.childNodes) {
    for (var cell of row.childNodes) {
      let val = '';
      for (var node of cell.childNodes) {
        if (node.nodeName == "INPUT") {
          if (node.checked) {
            val += '✓';
          }
        } else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
          val += node.firstChild.nodeValue;
        } else {
          val += node.nodeValue;
        }
      }
      if (output == 'csv') {
        val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
        if (isNumeric(val)) {
          val = +val;                     // use number
        } else {
          val = `"${val}"`;               // enclosed within double-quote
        }
      }
      text += val;
      if (cell != row.lastChild) {
        text += (output == 'csv' ? ',' : '\t');
      }
    }
    text += '\n';
  }

  if (output != 'clipboard') {
    // To file: csv or txt
    var blob = new Blob([text], {
      type: `text/${output}`
    });
    saveFile(`${pcbdata.metadata.title}.${output}`, blob);
  } else {
    // To clipboard
    var textArea = document.createElement("textarea");
    textArea.classList.add('clipboard-temp');
    textArea.value = text;

    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();

    try {
      if (document.execCommand('copy')) {
        console.log('Bom copied to clipboard.');
      }
    } catch (err) {
      console.log('Can not copy to clipboard.');
    }

    document.body.removeChild(textArea);
  }
}

function isNumeric(str) {
  /* https://stackoverflow.com/a/175787 */
  return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}

function removeGutterNode(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].classList &&
      node.childNodes[i].classList.contains("gutter")) {
      node.removeChild(node.childNodes[i]);
      break;
    }
  }
}

function cleanGutters() {
  removeGutterNode(document.getElementById("bot"));
  removeGutterNode(document.getElementById("canvasdiv"));
}

var units = {
  prefixes: {
    giga: ["G", "g", "giga", "Giga", "GIGA"],
    mega: ["M", "mega", "Mega", "MEGA"],
    kilo: ["K", "k", "kilo", "Kilo", "KILO"],
    milli: ["m", "milli", "Milli", "MILLI"],
    micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
    nano: ["N", "n", "nano", "Nano", "NANO"],
    pico: ["P", "p", "pico", "Pico", "PICO"],
  },
  unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  unitsLong: [
    "OHM", "Ohm", "ohm", "ohms",
    "FARAD", "Farad", "farad",
    "HENRY", "Henry", "henry"
  ],
  getMultiplier: function (s) {
    if (this.prefixes.giga.includes(s)) return 1e9;
    if (this.prefixes.mega.includes(s)) return 1e6;
    if (this.prefixes.kilo.includes(s)) return 1e3;
    if (this.prefixes.milli.includes(s)) return 1e-3;
    if (this.prefixes.micro.includes(s)) return 1e-6;
    if (this.prefixes.nano.includes(s)) return 1e-9;
    if (this.prefixes.pico.includes(s)) return 1e-12;
    return 1;
  },
  valueRegex: null,
}

function initUtils() {
  var allPrefixes = units.prefixes.giga
    .concat(units.prefixes.mega)
    .concat(units.prefixes.kilo)
    .concat(units.prefixes.milli)
    .concat(units.prefixes.micro)
    .concat(units.prefixes.nano)
    .concat(units.prefixes.pico);
  var allUnits = units.unitsShort.concat(units.unitsLong);
  units.valueRegex = new RegExp("^([0-9\.]+)" +
    "\\s*(" + allPrefixes.join("|") + ")?" +
    "(" + allUnits.join("|") + ")?" +
    "(\\b.*)?$", "");
  units.valueAltRegex = new RegExp("^([0-9]*)" +
    "(" + units.unitsShort.join("|") + ")?" +
    "([GgMmKkUuNnPp])?" +
    "([0-9]*)" +
    "(\\b.*)?$", "");
  if (config.fields.includes("Value")) {
    var index = config.fields.indexOf("Value");
    pcbdata.bom["parsedValues"] = {};
    for (var id in pcbdata.bom.fields) {
      pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
    }
  }
}

function parseValue(val, ref) {
  var inferUnit = (unit, ref) => {
    if (unit) {
      unit = unit.toLowerCase();
      if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
        unit = 'r';
      }
      unit = unit[0];
    } else {
      ref = /^([a-z]+)\d+$/i.exec(ref);
      if (ref) {
        ref = ref[1].toLowerCase();
        if (ref == "c") unit = 'f';
        else if (ref == "l") unit = 'h';
        else if (ref == "r" || ref == "rv") unit = 'r';
        else unit = null;
      }
    }
    return unit;
  };
  val = val.replace(/,/g, "");
  var match = units.valueRegex.exec(val);
  var unit;
  if (match) {
    val = parseFloat(match[1]);
    if (match[2]) {
      val = val * units.getMultiplier(match[2]);
    }
    unit = inferUnit(match[3], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[4],
    }
  }
  match = units.valueAltRegex.exec(val);
  if (match && (match[1] || match[4])) {
    val = parseFloat(match[1] + "." + match[4]);
    if (match[3]) {
      val = val * units.getMultiplier(match[3]);
    }
    unit = inferUnit(match[2], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[5],
    }
  }
  return null;
}

function valueCompare(a, b, stra, strb) {
  if (a === null && b === null) {
    // Failed to parse both values, compare them as strings.
    if (stra != strb) return stra > strb ? 1 : -1;
    else return 0;
  } else if (a === null) {
    return 1;
  } else if (b === null) {
    return -1;
  } else {
    if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
    else if (a.val != b.val) return a.val > b.val ? 1 : -1;
    else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
    else return 0;
  }
}

function validateSaveImgDimension(element) {
  var valid = false;
  var intValue = 0;
  if (/^[1-9]\d*$/.test(element.value)) {
    intValue = parseInt(element.value);
    if (intValue <= 16000) {
      valid = true;
    }
  }
  if (valid) {
    element.classList.remove("invalid");
  } else {
    element.classList.add("invalid");
  }
  return intValue;
}

function saveImage(layer) {
  var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  var bgcolor = null;
  if (!document.getElementById("render-save-transparent").checked) {
    var style = getComputedStyle(topmostdiv);
    bgcolor = style.getPropertyValue("background-color");
  }
  if (!width || !height) return;

  // Prepare image
  var canvas = document.createElement("canvas");
  var layerdict = {
    transform: {
      x: 0,
      y: 0,
      s: 1,
      panx: 0,
      pany: 0,
      zoom: 1,
    },
    bg: canvas,
    fab: canvas,
    silk: canvas,
    highlight: canvas,
    layer: layer,
  }
  // Do the rendering
  recalcLayerScale(layerdict, width, height);
  prepareLayer(layerdict);
  clearCanvas(canvas, bgcolor);
  drawBackground(layerdict, false);
  drawHighlightsOnLayer(layerdict, false);

  // Save image
  var imgdata = canvas.toDataURL("image/png");

  var filename = pcbdata.metadata.title;
  if (pcbdata.metadata.revision) {
    filename += `.${pcbdata.metadata.revision}`;
  }
  filename += `.${layer}.png`;
  saveFile(filename, dataURLtoBlob(imgdata));
}

function saveSettings() {
  var data = {
    type: "InteractiveHtmlBom settings",
    version: 1,
    pcbmetadata: pcbdata.metadata,
    settings: settings,
  }
  var blob = new Blob([JSON.stringify(data, null, 4)], {
    type: "application/json"
  });
  saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}

function loadSettings() {
  var input = document.createElement("input");
  input.type = "file";
  input.accept = ".settings.json";
  input.onchange = function (e) {
    var file = e.target.files[0];
    var reader = new FileReader();
    reader.onload = readerEvent => {
      var content = readerEvent.target.result;
      var newSettings;
      try {
        newSettings = JSON.parse(content);
      } catch (e) {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      if (newSettings.type != "InteractiveHtmlBom settings") {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
      if (metadataMatches) {
        for (var k in pcbdata.metadata) {
          if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
            metadataMatches = false;
          }
        }
      }
      if (!metadataMatches) {
        var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
        var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
        if (!confirm(
          `Settins file metadata does not match current metadata.\n\n` +
          `Page metadata:\n${currentMetadata}\n\n` +
          `Settings file metadata:\n${fileMetadata}\n\n` +
          `Press OK if you would like to import settings anyway.`)) {
          return;
        }
      }
      overwriteSettings(newSettings.settings);
    }
    reader.readAsText(file, 'UTF-8');
  }
  input.click();
}

function resetSettings() {
  if (!confirm(
    `This will reset all checkbox states and other settings.\n\n` +
    `Press OK if you want to continue.`)) {
    return;
  }
  if (storage) {
    var keys = [];
    for (var i = 0; i < storage.length; i++) {
      var key = storage.key(i);
      if (key.startsWith(storagePrefix)) keys.push(key);
    }
    for (var key of keys) storage.removeItem(key);
  }
  location.reload();
}

function overwriteSettings(newSettings) {
  initDone = false;
  Object.assign(settings, newSettings);
  writeStorage("bomlayout", settings.bomlayout);
  writeStorage("bommode", settings.bommode);
  writeStorage("canvaslayout", settings.canvaslayout);
  writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  for (var checkbox of settings.checkboxes) {
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  }
  writeStorage("markWhenChecked", settings.markWhenChecked);
  padsVisible(settings.renderPads);
  document.getElementById("padsCheckbox").checked = settings.renderPads;
  fabricationVisible(settings.renderFabrication);
  document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  silkscreenVisible(settings.renderSilkscreen);
  document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  referencesVisible(settings.renderReferences);
  document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  valuesVisible(settings.renderValues);
  document.getElementById("valuesCheckbox").checked = settings.renderValues;
  tracksVisible(settings.renderTracks);
  document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  zonesVisible(settings.renderZones);
  document.getElementById("zonesCheckbox").checked = settings.renderZones;
  dnpOutline(settings.renderDnpOutline);
  document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  setRedrawOnDrag(settings.redrawOnDrag);
  document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  setDarkMode(settings.darkMode);
  document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  setHighlightPin1(settings.highlightpin1);
  document.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  setOffsetBackRotation(settings.offsetBackRotation);
  document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
  initDone = true;
  prepCheckboxes();
  changeBomLayout(settings.bomlayout);
}

function saveFile(filename, blob) {
  var link = document.createElement("a");
  var objurl = URL.createObjectURL(blob);
  link.download = filename;
  link.href = objurl;
  link.click();
}

function dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {
    type: mime
  });
}

var settings = {
  canvaslayout: "FB",
  bomlayout: "left-right",
  bommode: "grouped",
  checkboxes: [],
  checkboxStoredRefs: {},
  darkMode: false,
  highlightpin1: "none",
  redrawOnDrag: true,
  boardRotation: 0,
  offsetBackRotation: false,
  renderPads: true,
  renderReferences: true,
  renderValues: true,
  renderSilkscreen: true,
  renderFabrication: true,
  renderDnpOutline: false,
  renderTracks: true,
  renderZones: true,
  columnOrder: [],
  hiddenColumns: [],
  netColors: {},
}

function initDefaults() {
  settings.bomlayout = readStorage("bomlayout");
  if (settings.bomlayout === null) {
    settings.bomlayout = config.bom_view;
  }
  if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
    settings.bomlayout = config.bom_view;
  }
  settings.bommode = readStorage("bommode");
  if (settings.bommode === null) {
    settings.bommode = "grouped";
  }
  if (settings.bommode == "netlist" && !pcbdata.nets) {
    settings.bommode = "grouped";
  }
  if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
    settings.bommode = "grouped";
  }
  settings.canvaslayout = readStorage("canvaslayout");
  if (settings.canvaslayout === null) {
    settings.canvaslayout = config.layer_view;
  }
  var bomCheckboxes = readStorage("bomCheckboxes");
  if (bomCheckboxes === null) {
    bomCheckboxes = config.checkboxes;
  }
  settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  document.getElementById("bomCheckboxes").value = bomCheckboxes;

  var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
  if (highlightpin1 === "false") highlightpin1 = "none";
  if (highlightpin1 === "true") highlightpin1 = "all";
  setHighlightPin1(highlightpin1);
  document.forms.highlightpin1.highlightpin1.value = highlightpin1;

  settings.markWhenChecked = readStorage("markWhenChecked") || "";
  populateMarkWhenCheckedOptions();

  function initBooleanSetting(storageString, def, elementId, func) {
    var b = readStorage(storageString);
    if (b === null) {
      b = def;
    } else {
      b = (b == "true");
    }
    document.getElementById(elementId).checked = b;
    func(b);
  }

  initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
  if ("tracks" in pcbdata) {
    initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
    initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  } else {
    document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
    tracksVisible(false);
    zonesVisible(false);
  }
  initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);

  var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
  var hcols = JSON.parse(readStorage("hiddenColumns"));
  if (hcols === null) {
    hcols = [];
  }
  settings.hiddenColumns = hcols.filter(e => fields.includes(e));

  var cord = JSON.parse(readStorage("columnOrder"));
  if (cord === null) {
    cord = fields;
  } else {
    cord = cord.filter(e => fields.includes(e));
    if (cord.length != fields.length)
      cord = fields;
  }
  settings.columnOrder = cord;

  settings.boardRotation = readStorage("boardRotation");
  if (settings.boardRotation === null) {
    settings.boardRotation = config.board_rotation * 5;
  } else {
    settings.boardRotation = parseInt(settings.boardRotation);
  }
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);

  settings.netColors = JSON.parse(readStorage("netColors")) || {};
}

// Helper classes for user js callbacks.

const IBOM_EVENT_TYPES = {
  ALL: "all",
  HIGHLIGHT_EVENT: "highlightEvent",
  CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
  BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}

const EventHandler = {
  callbacks: {},
  init: function () {
    for (eventType of Object.values(IBOM_EVENT_TYPES))
      this.callbacks[eventType] = [];
  },
  registerCallback: function (eventType, callback) {
    this.callbacks[eventType].push(callback);
  },
  emitEvent: function (eventType, eventArgs) {
    event = {
      eventType: eventType,
      args: eventArgs,
    }
    var callback;
    for (callback of this.callbacks[eventType])
      callback(event);
    for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
      callback(event);
  }
}
EventHandler.init();

///////////////////////////////////////////////

///////////////////////////////////////////////
/* PCB rendering code */

var emptyContext2d = document.createElement("canvas").getContext("2d");

function deg2rad(deg) {
  return deg * Math.PI / 180;
}

function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  var point = [
    linepoint[0] * text.width + offsetx,
    linepoint[1] * text.height + offsety
  ];
  // This approximates pcbnew behavior with how text tilts depending on horizontal justification
  point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
  return point;
}

function drawText(ctx, text, color) {
  if ("ref" in text && !settings.renderReferences) return;
  if ("val" in text && !settings.renderValues) return;
  ctx.save();
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  ctx.lineWidth = text.thickness;
  if ("svgpath" in text) {
    ctx.stroke(new Path2D(text.svgpath));
    ctx.restore();
    return;
  }
  if ("polygons" in text) {
    ctx.fill(getPolygonsPath(text));
    ctx.restore();
    return;
  }
  ctx.translate(...text.pos);
  ctx.translate(text.thickness * 0.5, 0);
  var angle = -text.angle;
  if (text.attr.includes("mirrored")) {
    ctx.scale(-1, 1);
    angle = -angle;
  }
  var tilt = 0;
  if (text.attr.includes("italic")) {
    tilt = 0.125;
  }
  var interline = text.height * 1.5 + text.thickness;
  var txt = text.text.split("\n");
  // KiCad ignores last empty line.
  if (txt[txt.length - 1] == '') txt.pop();
  ctx.rotate(deg2rad(angle));
  var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
  offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
  for (var i in txt) {
    var lineWidth = text.thickness + interline / 2 * tilt;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        lineWidth += fourSpaces - lineWidth % fourSpaces;
      } else {
        if (txt[i][j] == '~') {
          j++;
          if (j == txt[i].length)
            break;
        }
        lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
      }
    }
    var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
    var inOverbar = false;
    for (var j = 0; j < txt[i].length; j++) {
      if (config.kicad_text_formatting) {
        if (txt[i][j] == '\t') {
          var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
          offsetx += fourSpaces - offsetx % fourSpaces;
          continue;
        } else if (txt[i][j] == '~') {
          j++;
          if (j == txt[i].length)
            break;
          if (txt[i][j] != '~') {
            inOverbar = !inOverbar;
          }
        }
      }
      var glyph = pcbdata.font_data[txt[i][j]];
      if (inOverbar) {
        var overbarStart = [offsetx, -text.height * 1.4 + offsety];
        var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];

        if (!lastHadOverbar) {
          overbarStart[0] += text.height * 1.4 * tilt;
          lastHadOverbar = true;
        }
        ctx.beginPath();
        ctx.moveTo(...overbarStart);
        ctx.lineTo(...overbarEnd);
        ctx.stroke();
      } else {
        lastHadOverbar = false;
      }
      for (var line of glyph.l) {
        ctx.beginPath();
        ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
        for (var k = 1; k < line.length; k++) {
          ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
        }
        ctx.stroke();
      }
      offsetx += glyph.w * text.width;
    }
    offsety += interline;
  }
  ctx.restore();
}

function drawedge(ctx, scalefactor, edge, color) {
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  if ("svgpath" in edge) {
    ctx.stroke(new Path2D(edge.svgpath));
  } else {
    ctx.beginPath();
    if (edge.type == "segment") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(...edge.end);
    }
    if (edge.type == "rect") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(edge.start[0], edge.end[1]);
      ctx.lineTo(...edge.end);
      ctx.lineTo(edge.end[0], edge.start[1]);
      ctx.lineTo(...edge.start);
    }
    if (edge.type == "arc") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        deg2rad(edge.startangle),
        deg2rad(edge.endangle));
    }
    if (edge.type == "circle") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        0, 2 * Math.PI);
      ctx.closePath();
    }
    if (edge.type == "curve") {
      ctx.moveTo(...edge.start);
      ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
    }
    if("filled" in edge && edge.filled)
      ctx.fill();
    else
      ctx.stroke();
  }
}

function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  var path = new Path2D();
  var width = size[0];
  var height = size[1];
  var x = width * -0.5;
  var y = height * -0.5;
  var chamfOffset = Math.min(width, height) * chamfratio;
  path.moveTo(x, 0);
  if (chamfpos & 4) {
    path.lineTo(x, y + height - chamfOffset);
    path.lineTo(x + chamfOffset, y + height);
    path.lineTo(0, y + height);
  } else {
    path.arcTo(x, y + height, x + width, y + height, radius);
  }
  if (chamfpos & 8) {
    path.lineTo(x + width - chamfOffset, y + height);
    path.lineTo(x + width, y + height - chamfOffset);
    path.lineTo(x + width, 0);
  } else {
    path.arcTo(x + width, y + height, x + width, y, radius);
  }
  if (chamfpos & 2) {
    path.lineTo(x + width, y + chamfOffset);
    path.lineTo(x + width - chamfOffset, y);
    path.lineTo(0, y);
  } else {
    path.arcTo(x + width, y, x, y, radius);
  }
  if (chamfpos & 1) {
    path.lineTo(x + chamfOffset, y);
    path.lineTo(x, y + chamfOffset);
    path.lineTo(x, 0);
  } else {
    path.arcTo(x, y, x, y + height, radius);
  }
  path.closePath();
  return path;
}

function getOblongPath(size) {
  return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}

function getPolygonsPath(shape) {
  if (shape.path2d) {
    return shape.path2d;
  }
  if ("svgpath" in shape) {
    shape.path2d = new Path2D(shape.svgpath);
  } else {
    var path = new Path2D();
    for (var polygon of shape.polygons) {
      path.moveTo(...polygon[0]);
      for (var i = 1; i < polygon.length; i++) {
        path.lineTo(...polygon[i]);
      }
      path.closePath();
    }
    shape.path2d = path;
  }
  return shape.path2d;
}

function drawPolygonShape(ctx, scalefactor, shape, color) {
  ctx.save();
  if (!("svgpath" in shape)) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  if("filled" in shape && !shape.filled) {
    ctx.strokeStyle = color;
    ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
    ctx.lineCap = "round";
    ctx.lineJoin = "round";
    ctx.stroke(getPolygonsPath(shape));
  } else {
    ctx.fillStyle = color;
    ctx.fill(getPolygonsPath(shape));
  }
  ctx.restore();
}

function drawDrawing(ctx, scalefactor, drawing, color) {
  if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
    drawedge(ctx, scalefactor, drawing, color);
  } else if (drawing.type == "polygon") {
    drawPolygonShape(ctx, scalefactor, drawing, color);
  } else {
    drawText(ctx, drawing, color);
  }
}

function getCirclePath(radius) {
  var path = new Path2D();
  path.arc(0, 0, radius, 0, 2 * Math.PI);
  path.closePath();
  return path;
}

function getCachedPadPath(pad) {
  if (!pad.path2d) {
    // if path2d is not set, build one and cache it on pad object
    if (pad.shape == "rect") {
      pad.path2d = new Path2D();
      pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
    } else if (pad.shape == "oval") {
      pad.path2d = getOblongPath(pad.size);
    } else if (pad.shape == "circle") {
      pad.path2d = getCirclePath(pad.size[0] / 2);
    } else if (pad.shape == "roundrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
    } else if (pad.shape == "chamfrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
    } else if (pad.shape == "custom") {
      pad.path2d = getPolygonsPath(pad);
    }
  }
  return pad.path2d;
}

function drawPad(ctx, pad, color, outline) {
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(-deg2rad(pad.angle));
  if (pad.offset) {
    ctx.translate(...pad.offset);
  }
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  var path = getCachedPadPath(pad);
  if (outline) {
    ctx.stroke(path);
  } else {
    ctx.fill(path);
  }
  ctx.restore();
}

function drawPadHole(ctx, pad, padHoleColor) {
  if (pad.type != "th") return;
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(-deg2rad(pad.angle));
  ctx.fillStyle = padHoleColor;
  if (pad.drillshape == "oblong") {
    ctx.fill(getOblongPath(pad.drillsize));
  } else {
    ctx.fill(getCirclePath(pad.drillsize[0] / 2));
  }
  ctx.restore();
}

function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
  if (highlight) {
    // draw bounding box
    if (footprint.layer == layer) {
      ctx.save();
      ctx.globalAlpha = 0.2;
      ctx.translate(...footprint.bbox.pos);
      ctx.rotate(deg2rad(-footprint.bbox.angle));
      ctx.translate(...footprint.bbox.relpos);
      ctx.fillStyle = colors.pad;
      ctx.fillRect(0, 0, ...footprint.bbox.size);
      ctx.globalAlpha = 1;
      ctx.strokeStyle = colors.pad;
      ctx.lineWidth = 3 / scalefactor;
      ctx.strokeRect(0, 0, ...footprint.bbox.size);
      ctx.restore();
    }
  }
  // draw drawings
  for (var drawing of footprint.drawings) {
    if (drawing.layer == layer) {
      drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
    }
  }
  ctx.lineWidth = 3 / scalefactor;
  // draw pads
  if (settings.renderPads) {
    for (var pad of footprint.pads) {
      if (pad.layers.includes(layer)) {
        drawPad(ctx, pad, colors.pad, outline);
        if (pad.pin1 &&
          (settings.highlightpin1 == "all" ||
            settings.highlightpin1 == "selected" && highlight)) {
          drawPad(ctx, pad, colors.outline, true);
        }
      }
    }
    for (var pad of footprint.pads) {
      drawPadHole(ctx, pad, colors.padHole);
    }
  }
}

function drawEdgeCuts(canvas, scalefactor) {
  var ctx = canvas.getContext("2d");
  var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  for (var edge of pcbdata.edges) {
    drawDrawing(ctx, scalefactor, edge, edgecolor);
  }
}

function drawFootprints(canvas, layer, scalefactor, highlight) {
  var ctx = canvas.getContext("2d");
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);

  var colors = {
    pad: style.getPropertyValue('--pad-color'),
    padHole: style.getPropertyValue('--pad-hole-color'),
    outline: style.getPropertyValue('--pin1-outline-color'),
  }

  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var mod = pcbdata.footprints[i];
    var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
    var h = highlightedFootprints.includes(i);
    var d = markedFootprints.has(i);
    if (highlight) {
      if(h && d) {
        colors.pad = style.getPropertyValue('--pad-color-highlight-both');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
      } else if (h) {
        colors.pad = style.getPropertyValue('--pad-color-highlight');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
      } else if (d) {
        colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
      }
    }
    if( h || d || !highlight) {
      drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
    }
  }
}

function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  var ctx = canvas.getContext("2d");
  for (var d of pcbdata.drawings[layername][layer]) {
    if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
      drawedge(ctx, scalefactor, d, edgeColor);
    } else if (d.type == "polygon") {
      drawPolygonShape(ctx, scalefactor, d, polygonColor);
    } else {
      drawText(ctx, d, textColor);
    }
  }
}

function drawTracks(canvas, layer, defaultColor, highlight) {
  ctx = canvas.getContext("2d");
  ctx.lineCap = "round";

  var hasHole = (track) => (
    'drillsize' in track &&
    track.start[0] == track.end[0] &&
    track.start[1] == track.end[1]);

  // First draw tracks and tented vias
  for (var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    if (!hasHole(track)) {
      ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
      ctx.lineWidth = track.width;
      ctx.beginPath();
      if ('radius' in track) {
        ctx.arc(
          ...track.center,
          track.radius,
          deg2rad(track.startangle),
          deg2rad(track.endangle));
      } else {
        ctx.moveTo(...track.start);
        ctx.lineTo(...track.end);
      }
      ctx.stroke();
    }
  }
  // Second pass to draw untented vias
  var style = getComputedStyle(topmostdiv);
  var holeColor = style.getPropertyValue('--pad-hole-color')

  for (var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    if (hasHole(track)) {
      ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
      ctx.lineWidth = track.width;
      ctx.beginPath();
      ctx.moveTo(...track.start);
      ctx.lineTo(...track.end);
      ctx.stroke();
      ctx.strokeStyle = holeColor;
      ctx.lineWidth = track.drillsize;
      ctx.lineTo(...track.end);
      ctx.stroke();
    }
  }
}

function drawZones(canvas, layer, defaultColor, highlight) {
  ctx = canvas.getContext("2d");
  ctx.lineJoin = "round";
  for (var zone of pcbdata.zones[layer]) {
    if (highlight && highlightedNet != zone.net) continue;
    ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
    ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
    if (!zone.path2d) {
      zone.path2d = getPolygonsPath(zone);
    }
    ctx.fill(zone.path2d, zone.fillrule || "nonzero");
    if (zone.width > 0) {
      ctx.lineWidth = zone.width;
      ctx.stroke(zone.path2d);
    }
  }
}

function clearCanvas(canvas, color = null) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  if (color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  } else {
    if (!window.matchMedia("print").matches)
      ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.restore();
}

function drawNets(canvas, layer, highlight) {
  var style = getComputedStyle(topmostdiv);
  if (settings.renderZones) {
    var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
    drawZones(canvas, layer, zoneColor, highlight);
  }
  if (settings.renderTracks) {
    var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
    drawTracks(canvas, layer, trackColor, highlight);
  }
  if (highlight && settings.renderPads) {
    var padColor = style.getPropertyValue('--pad-color-highlight');
    var padHoleColor = style.getPropertyValue('--pad-hole-color');
    var ctx = canvas.getContext("2d");
    for (var footprint of pcbdata.footprints) {
      // draw pads
      var padDrawn = false;
      for (var pad of footprint.pads) {
        if (highlightedNet != pad.net) continue;
        if (pad.layers.includes(layer)) {
          drawPad(ctx, pad, padColor, false);
          padDrawn = true;
        }
      }
      if (padDrawn) {
        // redraw all pad holes because some pads may overlap
        for (var pad of footprint.pads) {
          drawPadHole(ctx, pad, padHoleColor);
        }
      }
    }
  }
}

function drawHighlightsOnLayer(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.highlight);
  }
  if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
    drawFootprints(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true);
  }
  if (highlightedNet !== null) {
    drawNets(canvasdict.highlight, canvasdict.layer, true);
  }
}

function drawHighlights() {
  drawHighlightsOnLayer(allcanvas.front);
  drawHighlightsOnLayer(allcanvas.back);
}

function drawBackground(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.bg);
    clearCanvas(canvasdict.fab);
    clearCanvas(canvasdict.silk);
  }

  drawNets(canvasdict.bg, canvasdict.layer, false);
  drawFootprints(canvasdict.bg, canvasdict.layer,
    canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);

  var style = getComputedStyle(topmostdiv);
  var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  var textColor = style.getPropertyValue('--silkscreen-text-color');
  if (settings.renderSilkscreen) {
    drawBgLayer(
      "silkscreen", canvasdict.silk, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
  edgeColor = style.getPropertyValue('--fabrication-edge-color');
  polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  textColor = style.getPropertyValue('--fabrication-text-color');
  if (settings.renderFabrication) {
    drawBgLayer(
      "fabrication", canvasdict.fab, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
}

function prepareCanvas(canvas, flip, transform) {
  var ctx = canvas.getContext("2d");
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  ctx.scale(transform.zoom, transform.zoom);
  ctx.translate(transform.panx, transform.pany);
  if (flip) {
    ctx.scale(-1, 1);
  }
  ctx.translate(transform.x, transform.y);
  ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
  ctx.scale(transform.s, transform.s);
}

function prepareLayer(canvasdict) {
  var flip = (canvasdict.layer === "B");
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  }
}

function rotateVector(v, angle) {
  angle = deg2rad(angle);
  return [
    v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
    v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  ];
}

function applyRotation(bbox, flip) {
  var corners = [
    [bbox.minx, bbox.miny],
    [bbox.minx, bbox.maxy],
    [bbox.maxx, bbox.miny],
    [bbox.maxx, bbox.maxy],
  ];
  corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
  return {
    minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
    miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
    maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
    maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  }
}

function recalcLayerScale(layerdict, width, height) {
  var flip = (layerdict.layer === "B");
  var bbox = applyRotation(pcbdata.edges_bbox, flip);
  var scalefactor = 0.98 * Math.min(
    width / (bbox.maxx - bbox.minx),
    height / (bbox.maxy - bbox.miny)
  );
  if (scalefactor < 0.1) {
    scalefactor = 1;
  }
  layerdict.transform.s = scalefactor;
  if (flip) {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  } else {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  }
  layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    canvas = layerdict[c];
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = (width / devicePixelRatio) + "px";
    canvas.style.height = (height / devicePixelRatio) + "px";
  }
}

function redrawCanvas(layerdict) {
  prepareLayer(layerdict);
  drawBackground(layerdict);
  drawHighlightsOnLayer(layerdict);
}

function resizeCanvas(layerdict) {
  var canvasdivid = {
    "F": "frontcanvas",
    "B": "backcanvas"
  } [layerdict.layer];
  var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  recalcLayerScale(layerdict, width, height);
  redrawCanvas(layerdict);
}

function resizeAll() {
  resizeCanvas(allcanvas.front);
  resizeCanvas(allcanvas.back);
}

function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  var A = x - x1;
  var B = y - y1;
  var C = x2 - x1;
  var D = y2 - y1;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var dx, dy;
  if (len_sq == 0) {
    // start and end of the segment coincide
    dx = x - x1;
    dy = y - y1;
  } else {
    var param = dot / len_sq;
    var xx, yy;
    if (param < 0) {
      xx = x1;
      yy = y1;
    } else if (param > 1) {
      xx = x2;
      yy = y2;
    } else {
      xx = x1 + param * C;
      yy = y1 + param * D;
    }
    dx = x - xx;
    dy = y - yy;
  }
  return dx * dx + dy * dy <= d * d;
}

function modulo(n, mod) {
  return ((n % mod) + mod) % mod;
}

function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
  var dx = x - xc;
  var dy = y - yc;
  var r_sq = dx * dx + dy * dy;
  var rmin = Math.max(0, radius - d);
  var rmax = radius + d;

  if (r_sq < rmin * rmin || r_sq > rmax * rmax)
    return false;

  var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
  var dx1 = xc + radius * Math.cos(angle1) - x;
  var dy1 = yc + radius * Math.sin(angle1) - y;
  if (dx1 * dx1 + dy1 * dy1 <= d * d)
    return true;

  var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
  var dx2 = xc + radius * Math.cos(angle2) - x;
  var dy2 = yc + radius * Math.sin(angle2) - y;
  if (dx2 * dx2 + dy2 * dy2 <= d * d)
    return true;

  var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
  if (angle1 > angle2)
    return (angle >= angle2 || angle <= angle1);
  else
    return (angle >= angle1 && angle <= angle2);
}

function pointWithinPad(x, y, pad) {
  var v = [x - pad.pos[0], y - pad.pos[1]];
  v = rotateVector(v, pad.angle);
  if (pad.offset) {
    v[0] -= pad.offset[0];
    v[1] -= pad.offset[1];
  }
  return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}

function netHitScan(layer, x, y) {
  // Check track segments
  if (settings.renderTracks && pcbdata.tracks) {
    for (var track of pcbdata.tracks[layer]) {
      if ('radius' in track) {
        if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
          return track.net;
        }
      } else {
        if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
          return track.net;
        }
      }
    }
  }
  // Check pads
  if (settings.renderPads) {
    for (var footprint of pcbdata.footprints) {
      for (var pad of footprint.pads) {
        if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
          return pad.net;
        }
      }
    }
  }
  return null;
}

function pointWithinFootprintBbox(x, y, bbox) {
  var v = [x - bbox.pos[0], y - bbox.pos[1]];
  v = rotateVector(v, bbox.angle);
  return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
    bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}

function bboxHitScan(layer, x, y) {
  var result = [];
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var footprint = pcbdata.footprints[i];
    if (footprint.layer == layer) {
      if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
        result.push(i);
      }
    }
  }
  return result;
}

function handlePointerDown(e, layerdict) {
  if (e.button != 0 && e.button != 1) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  layerdict.pointerStates[e.pointerId] = {
    distanceTravelled: 0,
    lastX: e.offsetX,
    lastY: e.offsetY,
    downTime: Date.now(),
  };
}

function handleMouseClick(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var x = e.offsetX;
  var y = e.offsetY;
  var t = layerdict.transform;
  var flip = layerdict.layer === "B";
  if (flip) {
    x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  } else {
    x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  }
  y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
  if ("nets" in pcbdata) {
    var net = netHitScan(layerdict.layer, ...v);
    if (net !== highlightedNet) {
      netClicked(net);
    }
  }
  if (highlightedNet === null) {
    var footprints = bboxHitScan(layerdict.layer, ...v);
    if (footprints.length > 0) {
      footprintsClicked(footprints);
    }
  }
}

function handlePointerLeave(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();

  if (!settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }

  delete layerdict.pointerStates[e.pointerId];
}

function resetTransform(layerdict) {
  layerdict.transform.panx = 0;
  layerdict.transform.pany = 0;
  layerdict.transform.zoom = 1;
  redrawCanvas(layerdict);
}

function handlePointerUp(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  e.preventDefault();
  e.stopPropagation();

  if (e.button == 2) {
    // Reset pan and zoom on right click.
    resetTransform(layerdict);
    layerdict.anotherPointerTapped = false;
    return;
  }

  // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  var ptr = layerdict.pointerStates[e.pointerId];
  ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);

  if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
    if (Object.keys(layerdict.pointerStates).length == 1) {
      if (layerdict.anotherPointerTapped) {
        // This is the second pointer coming off of a two-finger tap
        resetTransform(layerdict);
      } else {
        // This is just a regular tap
        handleMouseClick(e, layerdict);
      }
      layerdict.anotherPointerTapped = false;
    } else {
      // This is the first finger coming off of what could become a two-finger tap
      layerdict.anotherPointerTapped = true;
    }
  } else {
    if (!settings.redrawOnDrag) {
      redrawCanvas(layerdict);
    }
    layerdict.anotherPointerTapped = false;
  }

  delete layerdict.pointerStates[e.pointerId];
}

function handlePointerMove(e, layerdict) {
  if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var thisPtr = layerdict.pointerStates[e.pointerId];

  var dx = e.offsetX - thisPtr.lastX;
  var dy = e.offsetY - thisPtr.lastY;

  // If this number is low on pointer up, we count the action as a click
  thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);

  if (Object.keys(layerdict.pointerStates).length == 1) {
    // This is a simple drag
    layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
    layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  } else if (Object.keys(layerdict.pointerStates).length == 2) {
    var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];

    var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
    var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));

    var scaleFactor = newDist / oldDist;

    if (scaleFactor != NaN) {
      layerdict.transform.zoom *= scaleFactor;

      var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
      layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
      layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
    }
  }

  thisPtr.lastX = e.offsetX;
  thisPtr.lastY = e.offsetY;

  if (settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }
}

function handleMouseWheel(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();
  var t = layerdict.transform;
  var wheeldelta = e.deltaY;
  if (e.deltaMode == 1) {
    // FF only, scroll by lines
    wheeldelta *= 30;
  } else if (e.deltaMode == 2) {
    wheeldelta *= 300;
  }
  var m = Math.pow(1.1, -wheeldelta / 40);
  // Limit amount of zoom per tick.
  if (m > 2) {
    m = 2;
  } else if (m < 0.5) {
    m = 0.5;
  }
  t.zoom *= m;
  var zoomd = (1 - m) / t.zoom;
  t.panx += devicePixelRatio * e.offsetX * zoomd;
  t.pany += devicePixelRatio * e.offsetY * zoomd;
  redrawCanvas(layerdict);
}

function addMouseHandlers(div, layerdict) {
  div.addEventListener("pointerdown", function(e) {
    handlePointerDown(e, layerdict);
  });
  div.addEventListener("pointermove", function(e) {
    handlePointerMove(e, layerdict);
  });
  div.addEventListener("pointerup", function(e) {
    handlePointerUp(e, layerdict);
  });
  var pointerleave = function(e) {
    handlePointerLeave(e, layerdict);
  }
  div.addEventListener("pointercancel", pointerleave);
  div.addEventListener("pointerleave", pointerleave);
  div.addEventListener("pointerout", pointerleave);

  div.onwheel = function(e) {
    handleMouseWheel(e, layerdict);
  }
  for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
    element.addEventListener("contextmenu", function(e) {
      e.preventDefault();
    }, false);
  }
}

function setRedrawOnDrag(value) {
  settings.redrawOnDrag = value;
  writeStorage("redrawOnDrag", value);
}

function setBoardRotation(value) {
  settings.boardRotation = value * 5;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  resizeAll();
}

function setOffsetBackRotation(value) {
  settings.offsetBackRotation = value;
  writeStorage("offsetBackRotation", value);
  resizeAll();
}

function initRender() {
  allcanvas = {
    front: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("F_bg"),
      fab: document.getElementById("F_fab"),
      silk: document.getElementById("F_slk"),
      highlight: document.getElementById("F_hl"),
      layer: "F",
    },
    back: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("B_bg"),
      fab: document.getElementById("B_fab"),
      silk: document.getElementById("B_slk"),
      highlight: document.getElementById("B_hl"),
      layer: "B",
    }
  };
  addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/*
 * Table reordering via Drag'n'Drop
 * Inspired by: https://htmldom.dev/drag-and-drop-table-column
 */

function setBomHandlers() {

  const bom = document.getElementById('bomtable');

  let dragName;
  let placeHolderElements;
  let draggingElement;
  let forcePopulation;
  let xOffset;
  let yOffset;
  let wasDragged;

  const mouseUpHandler = function(e) {
    // Delete dragging element
    draggingElement.remove();

    // Make BOM selectable again
    bom.style.removeProperty("userSelect");

    // Remove listeners
    document.removeEventListener('mousemove', mouseMoveHandler);
    document.removeEventListener('mouseup', mouseUpHandler);

    if (wasDragged) {
      // Redraw whole BOM
      populateBomTable();
    }
  }

  const mouseMoveHandler = function(e) {
    // Notice the dragging
    wasDragged = true;

    // Make the dragged element visible
    draggingElement.style.removeProperty("display");

    // Set elements position to mouse position
    draggingElement.style.left = `${e.screenX - xOffset}px`;
    draggingElement.style.top = `${e.screenY - yOffset}px`;

    // Forced redrawing of BOM table
    if (forcePopulation) {
      forcePopulation = false;
      // Copy array
      phe = Array.from(placeHolderElements);
      // populate BOM table again
      populateBomHeader(dragName, phe);
      populateBomBody(dragName, phe);
    }

    // Set up array of hidden columns
    var hiddenColumns = Array.from(settings.hiddenColumns);
    // In the ungrouped mode, quantity don't exist
    if (settings.bommode === "ungrouped")
      hiddenColumns.push("Quantity");
    // If no checkbox fields can be found, we consider them hidden
    if (settings.checkboxes.length == 0)
      hiddenColumns.push("checkboxes");

    // Get table headers and group them into checkboxes, extrafields and normal headers
    const bh = document.getElementById("bomhead");
    headers = Array.from(bh.querySelectorAll("th"))
    headers.shift() // numCol is not part of the columnOrder
    headerGroups = []
    lastCompoundClass = null;
    for (i = 0; i < settings.columnOrder.length; i++) {
      cElem = settings.columnOrder[i];
      if (hiddenColumns.includes(cElem)) {
        // Hidden columns appear as a dummy element
        headerGroups.push([]);
        continue;
      }
      elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
      if (elem.classList.contains("bom-checkbox")) {
        if (lastCompoundClass === "bom-checkbox") {
          cbGroup = headerGroups.pop();
          cbGroup.push(elem);
          headerGroups.push(cbGroup);
        } else {
          lastCompoundClass = "bom-checkbox";
          headerGroups.push([elem])
        }
      } else {
        headerGroups.push([elem])
      }
    }

    // Copy settings.columnOrder
    var columns = Array.from(settings.columnOrder)

    // Set up array with indices of hidden columns
    var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
    var dragIndex = columns.indexOf(dragName);
    var swapIndex = dragIndex;
    var swapDone = false;

    // Check if the current dragged element is swapable with the left or right element
    if (dragIndex > 0) {
      // Get left headers boundingbox
      swapIndex = dragIndex - 1;
      while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
        swapIndex--;
      if (!hiddenIndices.includes(swapIndex)) {
        box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
        if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
          swapElement = columns[dragIndex];
          columns.splice(dragIndex, 1);
          columns.splice(swapIndex, 0, swapElement);
          forcePopulation = true;
          swapDone = true;
        }
      }
    }
    if ((!swapDone) && dragIndex < headerGroups.length - 1) {
      // Get right headers boundingbox
      swapIndex = dragIndex + 1;
      while (hiddenIndices.includes(swapIndex))
        swapIndex++;
      if (swapIndex < headerGroups.length) {
        box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
        if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
          swapElement = columns[dragIndex];
          columns.splice(dragIndex, 1);
          columns.splice(swapIndex, 0, swapElement);
          forcePopulation = true;
          swapDone = true;
        }
      }
    }

    // Write back change to storage
    if (swapDone) {
      settings.columnOrder = columns
      writeStorage("columnOrder", JSON.stringify(columns));
    }

  }

  const mouseDownHandler = function(e) {
    var target = e.target;
    if (target.tagName.toLowerCase() != "td")
      target = target.parentElement;

    // Used to check if a dragging has ever happened
    wasDragged = false;

    // Create new element which will be displayed as the dragged column
    draggingElement = document.createElement("div")
    draggingElement.classList.add("dragging");
    draggingElement.style.display = "none";
    draggingElement.style.position = "absolute";
    draggingElement.style.overflow = "hidden";

    // Get bomhead and bombody elements
    const bh = document.getElementById("bomhead");
    const bb = document.getElementById("bombody");

    // Get all compound headers for the current column
    var compoundHeaders;
    if (target.classList.contains("bom-checkbox")) {
      compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
    } else {
      compoundHeaders = [target];
    }

    // Create new table which will display the column
    var newTable = document.createElement("table");
    newTable.classList.add("bom");
    newTable.style.background = "white";
    draggingElement.append(newTable);

    // Create new header element
    var newHeader = document.createElement("thead");
    newTable.append(newHeader);

    // Set up array for storing all placeholder elements
    placeHolderElements = [];

    // Add all compound headers to the new thead element and placeholders
    compoundHeaders.forEach(function(h) {
      clone = cloneElementWithDimensions(h);
      newHeader.append(clone);
      placeHolderElements.push(clone);
    });

    // Create new body element
    var newBody = document.createElement("tbody");
    newTable.append(newBody);

    // Get indices for compound headers
    var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));

    // For each row in the BOM body...
    var rows = bb.querySelectorAll("tr");
    rows.forEach(function(row) {
      // ..get the cells for the compound column
      const tds = row.querySelectorAll("td");
      var copytds = idxs.map(i => tds[i]);
      // Add them to the new element and the placeholders
      var newRow = document.createElement("tr");
      copytds.forEach(function(td) {
        clone = cloneElementWithDimensions(td);
        newRow.append(clone);
        placeHolderElements.push(clone);
      });
      newBody.append(newRow);
    });

    // Compute width for compound header
    var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
    draggingElement.style.width = `${width}px`;

    // Insert the new dragging element and disable selection on BOM
    bom.insertBefore(draggingElement, null);
    bom.style.userSelect = "none";

    // Determine the mouse position offset
    xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
    yOffset = e.screenY - compoundHeaders[0].offsetTop;

    // Get name for the column in settings.columnOrder
    dragName = getColumnOrderName(target);

    // Change text and class for placeholder elements
    placeHolderElements = placeHolderElements.map(function(e) {
      newElem = cloneElementWithDimensions(e);
      newElem.textContent = "";
      newElem.classList.add("placeholder");
      return newElem;
    });

    // On next mouse move, the whole BOM needs to be redrawn to show the placeholders
    forcePopulation = true;

    // Add listeners for move and up on mouse
    document.addEventListener('mousemove', mouseMoveHandler);
    document.addEventListener('mouseup', mouseUpHandler);
  }

  // In netlist mode, there is nothing to reorder
  if (settings.bommode === "netlist")
    return;

  // Add mouseDownHandler to every column except the numCol
  bom.querySelectorAll("th")
    .forEach(function(head) {
      if (!head.classList.contains("numCol")) {
        head.onmousedown = mouseDownHandler;
      }
    });

}

function getBoundingClientRectFromMultiple(elements) {
  var elems = Array.from(elements);

  if (elems.length == 0)
    return null;

  var box = elems.shift()
    .getBoundingClientRect();

  elems.forEach(function(elem) {
    var elembox = elem.getBoundingClientRect();
    box.left = Math.min(elembox.left, box.left);
    box.top = Math.min(elembox.top, box.top);
    box.width += elembox.width;
    box.height = Math.max(elembox.height, box.height);
  });

  return box;
}

function cloneElementWithDimensions(elem) {
  var newElem = elem.cloneNode(true);
  newElem.style.height = window.getComputedStyle(elem).height;
  newElem.style.width = window.getComputedStyle(elem).width;
  return newElem;
}

function getBomTableHeaderIndex(elem) {
  const bh = document.getElementById('bomhead');
  const ths = Array.from(bh.querySelectorAll("th"));
  return ths.indexOf(elem);
}

function getColumnOrderName(elem) {
  var cname = elem.getAttribute("col_name");
  if (cname === "bom-checkbox")
    return "checkboxes";
  else
    return cname;
}

function resizableGrid(tablehead) {
  var cols = tablehead.firstElementChild.children;
  var rowWidth = tablehead.offsetWidth;

  for (var i = 1; i < cols.length; i++) {
    if (cols[i].classList.contains("bom-checkbox"))
      continue;
    cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
  }

  for (var i = 1; i < cols.length - 1; i++) {
    var div = document.createElement('div');
    div.className = "column-width-handle";
    cols[i].appendChild(div);
    setListeners(div);
  }

  function setListeners(div) {
    var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;

    div.addEventListener('mousedown', function(e) {
      e.preventDefault();
      e.stopPropagation();

      curCol = e.target.parentElement;
      nxtCol = curCol.nextElementSibling;
      startX = e.pageX;

      var padding = paddingDiff(curCol);

      rowWidth = curCol.parentElement.offsetWidth;
      curColWidth = curCol.clientWidth - padding;
      nxtColWidth = nxtCol.clientWidth - padding;
    });

    document.addEventListener('mousemove', function(e) {
      if (startX) {
        var diffX = e.pageX - startX;
        diffX = -Math.min(-diffX, curColWidth - 20);
        diffX = Math.min(diffX, nxtColWidth - 20);

        curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
        nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
        console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
      }
    });

    document.addEventListener('mouseup', function(e) {
      curCol = undefined;
      nxtCol = undefined;
      startX = undefined;
      nxtColWidth = undefined;
      curColWidth = undefined
    });
  }

  function paddingDiff(col) {

    if (getStyleVal(col, 'box-sizing') == 'border-box') {
      return 0;
    }

    var padLeft = getStyleVal(col, 'padding-left');
    var padRight = getStyleVal(col, 'padding-right');
    return (parseInt(padLeft) + parseInt(padRight));

  }

  function getStyleVal(elm, css) {
    return (window.getComputedStyle(elm, null).getPropertyValue(css))
  }
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* DOM manipulation and misc code */

var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
var highlightedNet = null;
var lastClicked;

function dbg(html) {
  dbgdiv.innerHTML = html;
}

function redrawIfInitDone() {
  if (initDone) {
    redrawCanvas(allcanvas.front);
    redrawCanvas(allcanvas.back);
  }
}

function padsVisible(value) {
  writeStorage("padsVisible", value);
  settings.renderPads = value;
  redrawIfInitDone();
}

function referencesVisible(value) {
  writeStorage("referencesVisible", value);
  settings.renderReferences = value;
  redrawIfInitDone();
}

function valuesVisible(value) {
  writeStorage("valuesVisible", value);
  settings.renderValues = value;
  redrawIfInitDone();
}

function tracksVisible(value) {
  writeStorage("tracksVisible", value);
  settings.renderTracks = value;
  redrawIfInitDone();
}

function zonesVisible(value) {
  writeStorage("zonesVisible", value);
  settings.renderZones = value;
  redrawIfInitDone();
}

function dnpOutline(value) {
  writeStorage("dnpOutline", value);
  settings.renderDnpOutline = value;
  redrawIfInitDone();
}

function setDarkMode(value) {
  if (value) {
    topmostdiv.classList.add("dark");
  } else {
    topmostdiv.classList.remove("dark");
  }
  writeStorage("darkmode", value);
  settings.darkMode = value;
  redrawIfInitDone();
  if (initDone) {
    populateBomTable();
  }
}

function setShowBOMColumn(field, value) {
  if (field === "references") {
    var rl = document.getElementById("reflookup");
    rl.disabled = !value;
    if (!value) {
      rl.value = "";
      updateRefLookup("");
    }
  }

  var n = settings.hiddenColumns.indexOf(field);
  if (value) {
    if (n != -1) {
      settings.hiddenColumns.splice(n, 1);
    }
  } else {
    if (n == -1) {
      settings.hiddenColumns.push(field);
    }
  }

  writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));

  if (initDone) {
    populateBomTable();
  }

  redrawIfInitDone();
}


function setFullscreen(value) {
  if (value) {
    document.documentElement.requestFullscreen();
  } else {
    document.exitFullscreen();
  }
}

function fabricationVisible(value) {
  writeStorage("fabricationVisible", value);
  settings.renderFabrication = value;
  redrawIfInitDone();
}

function silkscreenVisible(value) {
  writeStorage("silkscreenVisible", value);
  settings.renderSilkscreen = value;
  redrawIfInitDone();
}

function setHighlightPin1(value) {
  writeStorage("highlightpin1", value);
  settings.highlightpin1 = value;
  redrawIfInitDone();
}

function getStoredCheckboxRefs(checkbox) {
  function convert(ref) {
    var intref = parseInt(ref);
    if (isNaN(intref)) {
      for (var i = 0; i < pcbdata.footprints.length; i++) {
        if (pcbdata.footprints[i].ref == ref) {
          return i;
        }
      }
      return -1;
    } else {
      return intref;
    }
  }
  if (!(checkbox in settings.checkboxStoredRefs)) {
    var val = readStorage("checkbox_" + checkbox);
    settings.checkboxStoredRefs[checkbox] = val ? val : "";
  }
  if (!settings.checkboxStoredRefs[checkbox]) {
    return new Set();
  } else {
    return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
  }
}

function getCheckboxState(checkbox, references) {
  var storedRefsSet = getStoredCheckboxRefs(checkbox);
  var currentRefsSet = new Set(references.map(r => r[1]));
  // Get difference of current - stored
  var difference = new Set(currentRefsSet);
  for (ref of storedRefsSet) {
    difference.delete(ref);
  }
  if (difference.size == 0) {
    // All the current refs are stored
    return "checked";
  } else if (difference.size == currentRefsSet.size) {
    // None of the current refs are stored
    return "unchecked";
  } else {
    // Some of the refs are stored
    return "indeterminate";
  }
}

function setBomCheckboxState(checkbox, element, references) {
  var state = getCheckboxState(checkbox, references);
  element.checked = (state == "checked");
  element.indeterminate = (state == "indeterminate");
}

function createCheckboxChangeHandler(checkbox, references, row) {
  return function () {
    refsSet = getStoredCheckboxRefs(checkbox);
    var markWhenChecked = settings.markWhenChecked == checkbox;
    eventArgs = {
      checkbox: checkbox,
      refs: references,
    }
    if (this.checked) {
      // checkbox ticked
      for (var ref of references) {
        refsSet.add(ref[1]);
      }
      if (markWhenChecked) {
        row.classList.add("checked");
        for (var ref of references) {
          markedFootprints.add(ref[1]);
        }
        drawHighlights();
      }
      eventArgs.state = 'checked';
    } else {
      // checkbox unticked
      for (var ref of references) {
        refsSet.delete(ref[1]);
      }
      if (markWhenChecked) {
        row.classList.remove("checked");
        for (var ref of references) {
          markedFootprints.delete(ref[1]);
        }
        drawHighlights();
      }
      eventArgs.state = 'unchecked';
    }
    settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
    updateCheckboxStats(checkbox);
    EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
  }
}

function clearHighlightedFootprints() {
  if (currentHighlightedRowId) {
    document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    currentHighlightedRowId = null;
    highlightedFootprints = [];
    highlightedNet = null;
  }
}

function createRowHighlightHandler(rowid, refs, net) {
  return function () {
    if (currentHighlightedRowId) {
      if (currentHighlightedRowId == rowid) {
        return;
      }
      document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    }
    document.getElementById(rowid).classList.add("highlighted");
    currentHighlightedRowId = rowid;
    highlightedFootprints = refs ? refs.map(r => r[1]) : [];
    highlightedNet = net;
    drawHighlights();
    EventHandler.emitEvent(
      IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
      rowid: rowid,
      refs: refs,
      net: net
    });
  }
}

function updateNetColors() {
  writeStorage("netColors", JSON.stringify(settings.netColors));
  redrawIfInitDone();
}

function netColorChangeHandler(net) {
  return (event) => {
    settings.netColors[net] = event.target.value;
    updateNetColors();
  }
}

function netColorRightClick(net) {
  return (event) => {
    if (event.button == 2) {
      event.preventDefault();
      event.stopPropagation();

      var style = getComputedStyle(topmostdiv);
      var defaultNetColor = style.getPropertyValue('--track-color').trim();
      event.target.value = defaultNetColor;
      delete settings.netColors[net];
      updateNetColors();
    }
  }
}

function entryMatches(entry) {
  if (settings.bommode == "netlist") {
    // entry is just a net name
    return entry.toLowerCase().indexOf(filter) >= 0;
  }
  // check refs
  if (!settings.hiddenColumns.includes("references")) {
    for (var ref of entry) {
      if (ref[0].toLowerCase().indexOf(filter) >= 0) {
        return true;
      }
    }
  }
  // check fields
  for (var i in config.fields) {
    var f = config.fields[i];
    if (!settings.hiddenColumns.includes(f)) {
      for (var ref of entry) {
        if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
          return true;
        }
      }
    }
  }
  return false;
}

function findRefInEntry(entry) {
  return entry.filter(r => r[0].toLowerCase() == reflookup);
}

function highlightFilter(s) {
  if (!filter) {
    return s;
  }
  var parts = s.toLowerCase().split(filter);
  if (parts.length == 1) {
    return s;
  }
  var r = "";
  var pos = 0;
  for (var i in parts) {
    if (i > 0) {
      r += '<mark class="highlight">' +
        s.substring(pos, pos + filter.length) +
        '</mark>';
      pos += filter.length;
    }
    r += s.substring(pos, pos + parts[i].length);
    pos += parts[i].length;
  }
  return r;
}

function checkboxSetUnsetAllHandler(checkboxname) {
  return function () {
    var checkboxnum = 0;
    while (checkboxnum < settings.checkboxes.length &&
      settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
      checkboxnum++;
    }
    if (checkboxnum >= settings.checkboxes.length) {
      return;
    }
    var allset = true;
    var checkbox;
    var row;
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      if (!checkbox.checked || checkbox.indeterminate) {
        allset = false;
        break;
      }
    }
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      checkbox.checked = !allset;
      checkbox.indeterminate = false;
      checkbox.onchange();
    }
  }
}

function createColumnHeader(name, cls, comparator, is_checkbox = false) {
  var th = document.createElement("TH");
  th.innerHTML = name;
  th.classList.add(cls);
  if (is_checkbox)
    th.setAttribute("col_name", "bom-checkbox");
  else
    th.setAttribute("col_name", name);
  var span = document.createElement("SPAN");
  span.classList.add("sortmark");
  span.classList.add("none");
  th.appendChild(span);
  var spacer = document.createElement("div");
  spacer.className = "column-spacer";
  th.appendChild(spacer);
  spacer.onclick = function () {
    if (currentSortColumn && th !== currentSortColumn) {
      // Currently sorted by another column
      currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
      currentSortColumn.childNodes[1].classList.add("none");
      currentSortColumn = null;
      currentSortOrder = null;
    }
    if (currentSortColumn && th === currentSortColumn) {
      // Already sorted by this column
      if (currentSortOrder == "asc") {
        // Sort by this column, descending order
        bomSortFunction = function (a, b) {
          return -comparator(a, b);
        }
        currentSortColumn.childNodes[1].classList.remove("asc");
        currentSortColumn.childNodes[1].classList.add("desc");
        currentSortOrder = "desc";
      } else {
        // Unsort
        bomSortFunction = null;
        currentSortColumn.childNodes[1].classList.remove("desc");
        currentSortColumn.childNodes[1].classList.add("none");
        currentSortColumn = null;
        currentSortOrder = null;
      }
    } else {
      // Sort by this column, ascending order
      bomSortFunction = comparator;
      currentSortColumn = th;
      currentSortColumn.childNodes[1].classList.remove("none");
      currentSortColumn.childNodes[1].classList.add("asc");
      currentSortOrder = "asc";
    }
    populateBomBody();
  }
  if (is_checkbox) {
    spacer.onclick = fancyDblClickHandler(
      spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
  }
  return th;
}

function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
  while (bomhead.firstChild) {
    bomhead.removeChild(bomhead.firstChild);
  }
  var tr = document.createElement("TR");
  var th = document.createElement("TH");
  th.classList.add("numCol");

  var vismenu = document.createElement("div");
  vismenu.id = "vismenu";
  vismenu.classList.add("menu");

  var visbutton = document.createElement("div");
  visbutton.classList.add("visbtn");
  visbutton.classList.add("hideonprint");

  var viscontent = document.createElement("div");
  viscontent.classList.add("menu-content");
  viscontent.id = "vismenu-content";

  settings.columnOrder.forEach(column => {
    if (typeof column !== "string")
      return;

    // Skip empty columns
    if (column === "checkboxes" && settings.checkboxes.length == 0)
      return;
    else if (column === "Quantity" && settings.bommode == "ungrouped")
      return;

    var label = document.createElement("label");
    label.classList.add("menu-label");

    var input = document.createElement("input");
    input.classList.add("visibility_checkbox");
    input.type = "checkbox";
    input.onchange = function (e) {
      setShowBOMColumn(column, e.target.checked)
    };
    input.checked = !(settings.hiddenColumns.includes(column));

    label.appendChild(input);
    if (column.length > 0)
      label.append(column[0].toUpperCase() + column.slice(1));

    viscontent.appendChild(label);
  });

  viscontent.childNodes[0].classList.add("menu-label-top");

  vismenu.appendChild(visbutton);
  if (settings.bommode != "netlist") {
    vismenu.appendChild(viscontent);
    th.appendChild(vismenu);
  }
  tr.appendChild(th);

  var checkboxCompareClosure = function (checkbox) {
    return (a, b) => {
      var stateA = getCheckboxState(checkbox, a);
      var stateB = getCheckboxState(checkbox, b);
      if (stateA > stateB) return -1;
      if (stateA < stateB) return 1;
      return 0;
    }
  }
  var stringFieldCompareClosure = function (fieldIndex) {
    return (a, b) => {
      var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
      var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
      if (fa != fb) return fa > fb ? 1 : -1;
      else return 0;
    }
  }
  var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
  var compareRefs = (a, b) => {
    var ra = referenceRegex.exec(a);
    var rb = referenceRegex.exec(b);
    if (ra === null || rb === null) {
      if (a != b) return a > b ? 1 : -1;
      return 0;
    } else {
      if (ra.groups.prefix != rb.groups.prefix) {
        return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
      }
      if (ra.groups.number != rb.groups.number) {
        return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
      }
      return 0;
    }
  }
  if (settings.bommode == "netlist") {
    tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
      if (a > b) return -1;
      if (a < b) return 1;
      return 0;
    }));
    tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
      return 0;
    }));
  } else {
    // Filter hidden columns
    var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
    var valueIndex = config.fields.indexOf("Value");
    var footprintIndex = config.fields.indexOf("Footprint");
    columns.forEach((column) => {
      if (column === placeHolderColumn) {
        var n = 1;
        if (column === "checkboxes")
          n = settings.checkboxes.length;
        for (i = 0; i < n; i++) {
          td = placeHolderElements.shift();
          tr.appendChild(td);
        }
        return;
      } else if (column === "checkboxes") {
        for (var checkbox of settings.checkboxes) {
          th = createColumnHeader(
            checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
          tr.appendChild(th);
        }
      } else if (column === "References") {
        tr.appendChild(createColumnHeader("References", "references", (a, b) => {
          var i = 0;
          while (i < a.length && i < b.length) {
            if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
            i++;
          }
          return a.length - b.length;
        }));
      } else if (column === "Value") {
        tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
          var ra = a[0][1], rb = b[0][1];
          return valueCompare(
            pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
            pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
        }));
        return;
      } else if (column === "Footprint") {
        tr.appendChild(createColumnHeader(
          "Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
      } else if (column === "Quantity" && settings.bommode == "grouped") {
        tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
          return a.length - b.length;
        }));
      } else {
        // Other fields
        var i = config.fields.indexOf(column);
        if (i < 0)
          return;
        tr.appendChild(createColumnHeader(
          column, `field${i + 1}`, stringFieldCompareClosure(i)));
      }
    });
  }
  bomhead.appendChild(tr);
}

function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
  const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
  while (bom.firstChild) {
    bom.removeChild(bom.firstChild);
  }
  highlightHandlers = [];
  footprintIndexToHandler = {};
  netsToHandler = {};
  currentHighlightedRowId = null;
  var first = true;
  var style = getComputedStyle(topmostdiv);
  var defaultNetColor = style.getPropertyValue('--track-color').trim();
  if (settings.bommode == "netlist") {
    bomtable = pcbdata.nets.slice();
  } else {
    switch (settings.canvaslayout) {
      case 'F':
        bomtable = pcbdata.bom.F.slice();
        break;
      case 'FB':
        bomtable = pcbdata.bom.both.slice();
        break;
      case 'B':
        bomtable = pcbdata.bom.B.slice();
        break;
    }
    if (settings.bommode == "ungrouped") {
      // expand bom table
      expandedTable = []
      for (var bomentry of bomtable) {
        for (var ref of bomentry) {
          expandedTable.push([ref]);
        }
      }
      bomtable = expandedTable;
    }
  }
  if (bomSortFunction) {
    bomtable = bomtable.sort(bomSortFunction);
  }
  for (var i in bomtable) {
    var bomentry = bomtable[i];
    if (filter && !entryMatches(bomentry)) {
      continue;
    }
    var references = null;
    var netname = null;
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    var rownum = +i + 1;
    tr.id = "bomrow" + rownum;
    td.textContent = rownum;
    tr.appendChild(td);
    if (settings.bommode == "netlist") {
      netname = bomentry;
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
      tr.appendChild(td);
      var color = settings.netColors[netname] || defaultNetColor;
      td = document.createElement("TD");
      var colorBox = document.createElement("INPUT");
      colorBox.type = "color";
      colorBox.value = color;
      colorBox.onchange = netColorChangeHandler(netname);
      colorBox.onmouseup = netColorRightClick(netname);
      colorBox.oncontextmenu = (e) => e.preventDefault();
      td.appendChild(colorBox);
      td.classList.add("color-column");
      tr.appendChild(td);
    } else {
      if (reflookup) {
        references = findRefInEntry(bomentry);
        if (references.length == 0) {
          continue;
        }
      } else {
        references = bomentry;
      }
      // Filter hidden columns
      var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
      columns.forEach((column) => {
        if (column === placeholderColumn) {
          var n = 1;
          if (column === "checkboxes")
            n = settings.checkboxes.length;
          for (i = 0; i < n; i++) {
            td = placeHolderElements.shift();
            tr.appendChild(td);
          }
          return;
        } else if (column === "checkboxes") {
          for (var checkbox of settings.checkboxes) {
            if (checkbox) {
              td = document.createElement("TD");
              var input = document.createElement("input");
              input.type = "checkbox";
              input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
              setBomCheckboxState(checkbox, input, references);
              if (input.checked && settings.markWhenChecked == checkbox) {
                tr.classList.add("checked");
              }
              td.appendChild(input);
              tr.appendChild(td);
            }
          }
        } else if (column === "References") {
          td = document.createElement("TD");
          td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
          tr.appendChild(td);
        } else if (column === "Quantity" && settings.bommode == "grouped") {
          // Quantity
          td = document.createElement("TD");
          td.textContent = references.length;
          tr.appendChild(td);
        } else {
          // All the other fields
          var field_index = config.fields.indexOf(column)
          if (field_index < 0)
            return;
          var valueSet = new Set();
          references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
          td = document.createElement("TD");
          var output = new Array();
          for (let item of valueSet) {
            const visible = highlightFilter(String(item));
            if (typeof item === 'string' && item.match(urlRegex)) {
              output.push(`<a href="${item}" target="_blank">${visible}</a>`);
            } else {
              output.push(visible);
            }
          }
          td.innerHTML = output.join(", ");
          tr.appendChild(td);
        }
      });
    }
    bom.appendChild(tr);
    var handler = createRowHighlightHandler(tr.id, references, netname);
    tr.onmousemove = handler;
    highlightHandlers.push({
      id: tr.id,
      handler: handler,
    });
    if (references !== null) {
      for (var refIndex of references.map(r => r[1])) {
        footprintIndexToHandler[refIndex] = handler;
      }
    }
    if (netname !== null) {
      netsToHandler[netname] = handler;
    }
    if ((filter || reflookup) && first) {
      handler();
      first = false;
    }
  }
  EventHandler.emitEvent(
    IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
    filter: filter,
    reflookup: reflookup,
    checkboxes: settings.checkboxes,
    bommode: settings.bommode,
  });
}

function highlightPreviousRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[highlightHandlers.length - 1].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[0].id == currentHighlightedRowId) {
      highlightHandlers[highlightHandlers.length - 1].handler();
    } else {
      for (var i = 0; i < highlightHandlers.length - 1; i++) {
        if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function highlightNextRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[0].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
      highlightHandlers[0].handler();
    } else {
      for (var i = 1; i < highlightHandlers.length; i++) {
        if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function populateBomTable() {
  populateBomHeader();
  populateBomBody();
  setBomHandlers();
  resizableGrid(bomhead);
}

function footprintsClicked(footprintIndexes) {
  var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
  for (var i = 1; i <= footprintIndexes.length; i++) {
    var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
    if (refIndex in footprintIndexToHandler) {
      lastClicked = refIndex;
      footprintIndexToHandler[refIndex]();
      smoothScrollToRow(currentHighlightedRowId);
      break;
    }
  }
}

function netClicked(net) {
  if (net in netsToHandler) {
    netsToHandler[net]();
    smoothScrollToRow(currentHighlightedRowId);
  } else {
    clearHighlightedFootprints();
    highlightedNet = net;
    drawHighlights();
  }
}

function updateFilter(input) {
  filter = input.toLowerCase();
  populateBomTable();
}

function updateRefLookup(input) {
  reflookup = input.toLowerCase();
  populateBomTable();
}

function changeCanvasLayout(layout) {
  document.getElementById("fl-btn").classList.remove("depressed");
  document.getElementById("fb-btn").classList.remove("depressed");
  document.getElementById("bl-btn").classList.remove("depressed");
  switch (layout) {
    case 'F':
      document.getElementById("fl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(1);
      }
      break;
    case 'B':
      document.getElementById("bl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(0);
      }
      break;
    default:
      document.getElementById("fb-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.setSizes([50, 50]);
      }
  }
  settings.canvaslayout = layout;
  writeStorage("canvaslayout", layout);
  resizeAll();
  changeBomMode(settings.bommode);
}

function populateMetadata() {
  document.getElementById("title").innerHTML = pcbdata.metadata.title;
  document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  document.getElementById("company").innerHTML = pcbdata.metadata.company;
  document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  if (pcbdata.metadata.title != "") {
    document.title = pcbdata.metadata.title + " BOM";
  }
  // Calculate board stats
  var fp_f = 0,
    fp_b = 0,
    pads_f = 0,
    pads_b = 0,
    pads_th = 0;
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    if (pcbdata.bom.skipped.includes(i)) continue;
    var mod = pcbdata.footprints[i];
    if (mod.layer == "F") {
      fp_f++;
    } else {
      fp_b++;
    }
    for (var pad of mod.pads) {
      if (pad.type == "th") {
        pads_th++;
      } else {
        if (pad.layers.includes("F")) {
          pads_f++;
        }
        if (pad.layers.includes("B")) {
          pads_b++;
        }
      }
    }
  }
  document.getElementById("stats-components-front").innerHTML = fp_f;
  document.getElementById("stats-components-back").innerHTML = fp_b;
  document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  document.getElementById("stats-th-pads").innerHTML = pads_th;
  // Update version string
  document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
    /^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}

function changeBomLayout(layout) {
  document.getElementById("bom-btn").classList.remove("depressed");
  document.getElementById("lr-btn").classList.remove("depressed");
  document.getElementById("tb-btn").classList.remove("depressed");
  switch (layout) {
    case 'bom-only':
      document.getElementById("bom-btn").classList.add("depressed");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      document.getElementById("frontcanvas").style.display = "none";
      document.getElementById("backcanvas").style.display = "none";
      document.getElementById("topmostdiv").style.height = "";
      document.getElementById("topmostdiv").style.display = "block";
      break;
    case 'top-bottom':
      document.getElementById("tb-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("topmostdiv").style.height = "100%";
      document.getElementById("topmostdiv").style.display = "flex";
      document.getElementById("bomdiv").classList.remove("split-horizontal");
      document.getElementById("canvasdiv").classList.remove("split-horizontal");
      document.getElementById("frontcanvas").classList.add("split-horizontal");
      document.getElementById("backcanvas").classList.add("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        direction: "vertical",
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        onDragEnd: resizeAll
      });
      break;
    case 'left-right':
      document.getElementById("lr-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("topmostdiv").style.height = "100%";
      document.getElementById("topmostdiv").style.display = "flex";
      document.getElementById("bomdiv").classList.add("split-horizontal");
      document.getElementById("canvasdiv").classList.add("split-horizontal");
      document.getElementById("frontcanvas").classList.remove("split-horizontal");
      document.getElementById("backcanvas").classList.remove("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        direction: "vertical",
        onDragEnd: resizeAll
      });
  }
  settings.bomlayout = layout;
  writeStorage("bomlayout", layout);
  changeCanvasLayout(settings.canvaslayout);
}

function changeBomMode(mode) {
  document.getElementById("bom-grouped-btn").classList.remove("depressed");
  document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
  document.getElementById("bom-netlist-btn").classList.remove("depressed");
  var chkbxs = document.getElementsByClassName("visibility_checkbox");

  switch (mode) {
    case 'grouped':
      document.getElementById("bom-grouped-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = false;
      }
      break;
    case 'ungrouped':
      document.getElementById("bom-ungrouped-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = false;
      }
      break;
    case 'netlist':
      document.getElementById("bom-netlist-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = true;
      }
  }

  writeStorage("bommode", mode);
  if (mode != settings.bommode) {
    settings.bommode = mode;
    bomSortFunction = null;
    currentSortColumn = null;
    currentSortOrder = null;
    clearHighlightedFootprints();
  }
  populateBomTable();
}

function focusFilterField() {
  focusInputField(document.getElementById("filter"));
}

function focusRefLookupField() {
  focusInputField(document.getElementById("reflookup"));
}

function toggleBomCheckbox(bomrowid, checkboxnum) {
  if (!bomrowid || checkboxnum > settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
  checkbox.checked = !checkbox.checked;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function checkBomCheckbox(bomrowid, checkboxname) {
  var checkboxnum = 0;
  while (checkboxnum < settings.checkboxes.length &&
    settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
    checkboxnum++;
  }
  if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
  checkbox.checked = true;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function setBomCheckboxes(value) {
  writeStorage("bomCheckboxes", value);
  settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
  prepCheckboxes();
  populateMarkWhenCheckedOptions();
  setMarkWhenChecked(settings.markWhenChecked);
}

function setMarkWhenChecked(value) {
  writeStorage("markWhenChecked", value);
  settings.markWhenChecked = value;
  markedFootprints.clear();
  for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
    markedFootprints.add(ref);
  }
  populateBomTable();
  drawHighlights();
}

function prepCheckboxes() {
  var table = document.getElementById("checkbox-stats");
  while (table.childElementCount > 1) {
    table.removeChild(table.lastChild);
  }
  if (settings.checkboxes.length) {
    table.style.display = "";
  } else {
    table.style.display = "none";
  }
  for (var checkbox of settings.checkboxes) {
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    td.innerHTML = checkbox;
    tr.appendChild(td);
    td = document.createElement("TD");
    td.id = "checkbox-stats-" + checkbox;
    var progressbar = document.createElement("div");
    progressbar.classList.add("bar");
    td.appendChild(progressbar);
    var text = document.createElement("div");
    text.classList.add("text");
    td.appendChild(text);
    tr.appendChild(td);
    table.appendChild(tr);
    updateCheckboxStats(checkbox);
  }
}

function populateMarkWhenCheckedOptions() {
  var container = document.getElementById("markWhenCheckedContainer");

  if (settings.checkboxes.length == 0) {
    container.parentElement.style.display = "none";
    return;
  }

  container.innerHTML = '';
  container.parentElement.style.display = "inline-block";

  function createOption(name, displayName) {
    var id = "markWhenChecked-" + name;

    var div = document.createElement("div");
    div.classList.add("radio-container");

    var input = document.createElement("input");
    input.type = "radio";
    input.name = "markWhenChecked";
    input.value = name;
    input.id = id;
    input.onchange = () => setMarkWhenChecked(name);
    div.appendChild(input);

    // Preserve the selected element when the checkboxes change
    if (name == settings.markWhenChecked) {
      input.checked = true;
    }

    var label = document.createElement("label");
    label.innerHTML = displayName;
    label.htmlFor = id;
    div.appendChild(label);

    container.appendChild(div);
  }
  createOption("", "None");
  for (var checkbox of settings.checkboxes) {
    createOption(checkbox, checkbox);
  }
}

function updateCheckboxStats(checkbox) {
  var checked = getStoredCheckboxRefs(checkbox).size;
  var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
  var percent = checked * 100.0 / total;
  var td = document.getElementById("checkbox-stats-" + checkbox);
  td.firstChild.style.width = percent + "%";
  td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}

function constrain(number, min, max) {
  return Math.min(Math.max(parseInt(number), min), max);
}

document.onkeydown = function (e) {
  switch (e.key) {
    case "n":
      if (document.activeElement.type == "text") {
        return;
      }
      if (currentHighlightedRowId !== null) {
        checkBomCheckbox(currentHighlightedRowId, "placed");
        highlightNextRow();
        e.preventDefault();
      }
      break;
    case "ArrowUp":
      highlightPreviousRow();
      e.preventDefault();
      break;
    case "ArrowDown":
      highlightNextRow();
      e.preventDefault();
      break;
    case "ArrowLeft":
    case "ArrowRight":
      if (document.activeElement.type != "text") {
        e.preventDefault();
        let boardRotationElement = document.getElementById("boardRotation")
        settings.boardRotation = parseInt(boardRotationElement.value);  // degrees / 5
        if (e.key == "ArrowLeft") {
          settings.boardRotation += 3;  // 15 degrees
        }
        else {
          settings.boardRotation -= 3;
        }
        settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
        boardRotationElement.value = settings.boardRotation
        setBoardRotation(settings.boardRotation);
      }
      break;
    default:
      break;
  }
  if (e.altKey) {
    switch (e.key) {
      case "f":
        focusFilterField();
        e.preventDefault();
        break;
      case "r":
        focusRefLookupField();
        e.preventDefault();
        break;
      case "z":
        changeBomLayout("bom-only");
        e.preventDefault();
        break;
      case "x":
        changeBomLayout("left-right");
        e.preventDefault();
        break;
      case "c":
        changeBomLayout("top-bottom");
        e.preventDefault();
        break;
      case "v":
        changeCanvasLayout("F");
        e.preventDefault();
        break;
      case "b":
        changeCanvasLayout("FB");
        e.preventDefault();
        break;
      case "n":
        changeCanvasLayout("B");
        e.preventDefault();
        break;
      default:
        break;
    }
    if (e.key >= '1' && e.key <= '9') {
      toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
      e.preventDefault();
    }
  }
}

function hideNetlistButton() {
  document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
  document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
  document.getElementById("bom-netlist-btn").style.display = "none";
}

function topToggle() {
  var top = document.getElementById("top");
  var toptoggle = document.getElementById("toptoggle");
  if (top.style.display === "none") {
    top.style.display = "flex";
    toptoggle.classList.remove("flipped");
  } else {
    top.style.display = "none";
    toptoggle.classList.add("flipped");
  }
}

window.onload = function (e) {
  initUtils();
  initRender();
  initStorage();
  initDefaults();
  cleanGutters();
  populateMetadata();
  dbgdiv = document.getElementById("dbg");
  bom = document.getElementById("bombody");
  bomhead = document.getElementById("bomhead");
  filter = "";
  reflookup = "";
  if (!("nets" in pcbdata)) {
    hideNetlistButton();
  }
  initDone = true;
  setBomCheckboxes(document.getElementById("bomCheckboxes").value);
  // Triggers render
  changeBomLayout(settings.bomlayout);

  // Users may leave fullscreen without touching the checkbox. Uncheck.
  document.addEventListener('fullscreenchange', () => {
    if (!document.fullscreenElement)
      document.getElementById('fullscreenCheckbox').checked = false;
  });
}

window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);

///////////////////////////////////////////////

///////////////////////////////////////////////
// EventHandler.registerCallback(IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, () => {
//     for(var tr of bom.childNodes) {
//         tr.onclick = tr.onmousemove;
//         tr.onmousemove = null;
//     };
// });

///////////////////////////////////////////////
  </script>
</head>

<body>

<div id="topmostdiv" class="topmostdiv">
  <div id="top">
    <div id="fileinfodiv">
      <table class="fileinfo">
        <tbody>
          <tr>
            <td id="title" class="title" style="width: 70%">
              Title
            </td>
            <td id="revision" class="title" style="width: 30%">
              Revision
            </td>
          </tr>
          <tr>
            <td id="company">
              Company
            </td>
            <td id="filedate">
              Date
            </td>
          </tr>
        </tbody>
      </table>
    </div>
    <div id="bomcontrols">
      <div class="hideonprint menu">
        <button class="menubtn"></button>
        <div class="menu-content">
          <label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
            <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
            Dark mode
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
            <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
            Full Screen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
            Fab layer
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
            Silkscreen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
            References
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
            Values
          </label>
          <div id="tracksAndZonesCheckboxes">
            <label class="menu-label" style="width: calc(50% - 18px)">
              <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
              Tracks
            </label><!-- This comment eats space! All of it!
            --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
              <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
              Zones
            </label>
          </div>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
            Pads
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
            DNP outlined
          </label>
          <label class="menu-label">
            <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
            Continuous redraw on drag
          </label>
          <label class="menu-label">
            Highlight first pin
            <form id="highlightpin1">
              <div class="flexbox">
                <label>
                  <input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
                  None
                </label>
                <label>
                  <input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
                  All
                </label>
                <label>
                  <input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
                  Selected
                </label>
              </div>
            </form>
          </label>
          <label class="menu-label">
            <span>Board rotation</span>
            <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
            <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
          </label>
          <label class="menu-label">
            <input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
            Offset back rotation
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Bom checkboxes</div>
            <input id="bomCheckboxes" class="menu-textbox" type=text
                   oninput="setBomCheckboxes(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Mark when checked</div>
            <div id="markWhenCheckedContainer"></div>
          </label>
          <label class="menu-label">
            <span class="shameless-plug">
              <span>Created using</span>
              <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
              <a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
            </span>
          </label>
        </div>
      </div>
      <div class="button-container hideonprint">
        <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                title="Front only">F
        </button>
        <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                title="Front and Back">FB
        </button>
        <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                title="Back only">B
        </button>
      </div>
      <div class="button-container hideonprint">
        <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                title="BOM only"></button>
        <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                title="BOM left, drawings right"></button>
        <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                title="BOM top, drawings bot"></button>
      </div>
      <div class="button-container hideonprint">
        <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
                title="Grouped BOM"></button>
        <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
                title="Ungrouped BOM"></button>
        <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
                title="Netlist"></button>
      </div>
      <div class="hideonprint menu">
        <button class="statsbtn"></button>
        <div class="menu-content">
          <table class="stats">
            <tbody>
              <tr>
                <td width="40%">Board stats</td>
                <td>Front</td>
                <td>Back</td>
                <td>Total</td>
              </tr>
              <tr>
                <td>Components</td>
                <td id="stats-components-front">~</td>
                <td id="stats-components-back">~</td>
                <td id="stats-components-total">~</td>
              </tr>
              <tr>
                <td>Groups</td>
                <td id="stats-groups-front">~</td>
                <td id="stats-groups-back">~</td>
                <td id="stats-groups-total">~</td>
              </tr>
              <tr>
                <td>SMD pads</td>
                <td id="stats-smd-pads-front">~</td>
                <td id="stats-smd-pads-back">~</td>
                <td id="stats-smd-pads-total">~</td>
              </tr>
              <tr>
                <td>TH pads</td>
                <td colspan=3 id="stats-th-pads">~</td>
              </tr>
            </tbody>
          </table>
          <table class="stats">
            <col width="40%"/><col />
            <tbody id="checkbox-stats">
              <tr>
                <td colspan=2 style="border-top: 0">Checkboxes</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="hideonprint menu">
        <button class="iobtn"></button>
        <div class="menu-content">
          <div class="menu-label menu-label-top">
            <div style="margin-left: 5px;">Save board image</div>
            <div class="flexbox">
              <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
              <span>X</span>
              <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
            </div>
            <label>
              <input id="render-save-transparent" type="checkbox">
              Transparent background
            </label>
            <div class="flexbox">
              <button class="savebtn" onclick="saveImage('F')">Front</button>
              <button class="savebtn" onclick="saveImage('B')">Back</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Config and checkbox state</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveSettings()">Export</button>
              <button class="savebtn" onclick="loadSettings()">Import</button>
              <button class="savebtn" onclick="resetSettings()">Reset</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Save bom table as</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveBomTable('csv')">csv</button>
              <button class="savebtn" onclick="saveBomTable('txt')">txt</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div id="topdivider">
    <div class="hideonprint">
      <div id="toptoggle" onclick="topToggle()">︽</div>
    </div>
  </div>
  <div id="bot" class="split" style="flex: 1 1">
    <div id="bomdiv" class="split split-horizontal">
      <div style="width: 100%">
        <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
               oninput="updateRefLookup(this.value)">
        <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
               oninput="updateFilter(this.value)">
        <div class="button-container hideonprint" style="float: left; margin: 0;">
          <button id="copy" title="Copy bom table to clipboard"
               onclick="saveBomTable('clipboard')"></button>
        </div>
      </div>
      <div id="dbg"></div>
      <table class="bom" id="bomtable">
        <thead id="bomhead">
        </thead>
        <tbody id="bombody">
        </tbody>
      </table>
    </div>
    <div id="canvasdiv" class="split split-horizontal">
      <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
      <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
    </div>
  </div>
</div>

</body>

</html>
